本文主要是介绍[LeetCode] Reverse Linked List II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL
, m = 2 and n = 4,
return 1->4->3->2->5->NULL
.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
解题思路
解题思路与上一篇Reverse Linked List类似,只不过这里是反转部分链表。
因此,只需将m到n部分翻转,然后将m的前缀beforeM指向该部分反转后的头结点即可。如果beforeM为NULL,则m=1,m到n部分的头结点即为链表的头结点。
实现代码
//Runtime: 4 ms
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;struct ListNode{int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};class Solution {
public:ListNode* reverseBetween(ListNode* head, int m, int n) {ListNode *cur = head;ListNode *beforeM = NULL;for (int i = 1; i < m; i++){beforeM = cur;cur = cur->next;}ListNode *localhead = cur;ListNode *pre = cur;cur = cur->next;int count = n - m;while (count--){pre->next = cur->next;cur->next = localhead;localhead = cur;cur = pre->next;}if (beforeM == NULL){head = localhead;}else{beforeM->next = localhead;}return head;}
};void printList(ListNode *head)
{while(head != NULL){cout<<head->val<<" ";head = head->next;}cout<<endl;
}void dropList(ListNode *head)
{if (head == NULL) return;ListNode *temp;while (head != NULL){temp = head->next;delete head;head = temp;}
}int main()
{ListNode *head = new ListNode(0);ListNode *cur = head;for (int i = 0; i < 10; i++){ListNode *newnode = new ListNode(floor(rand()%77));cur->next = newnode;cur = newnode;}printList(head);Solution s;head = s.reverseBetween(head, 2, 5);printList(head);dropList(head);
}
这篇关于[LeetCode] Reverse Linked List II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!