Reverse a linked list from position m ton. 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.
看到题目的第一想法,就是经典的链表逆序的变形,思想简单。
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(n==m)
return head;
ListNode* curr = new ListNode(0);
ListNode* pre = curr;
curr->next = head;
int count = 1;
while(count < m)
{
curr = curr->next;
count++;
}
ListNode* thead = curr;
ListNode* temp;
curr = curr->next->next;
count++;
while(count <= n)
{
temp = curr->next;
curr->next = thead->next;
thead->next = curr;
curr = temp;
count++;
}
count=0;
while(count < n-m+1)
{
thead = thead->next;
count++;
}
if(thead != NULL)
thead->next = curr;
return pre->next;
}
};代码有点混乱,进了整理后如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(n==m)
return head;
n -= m;
ListNode* thead = new ListNode(0);
ListNode* pre = thead;
thead->next = head;
while(--m)
thead = thead->next;
ListNode* temp;
ListNode* pstart = thead->next;
while(n--)
{
temp = pstart->next;
pstart->next = temp->next;
temp -> next = thead->next;
thead->next = temp;
}
return pre->next;
}
};
本文介绍了一种在链表中从位置m到n进行逆序的方法,并提供了一个C++实现示例。该方法通过一次遍历完成逆序操作,适用于1≤m≤n≤链表长度的情况。
555

被折叠的 条评论
为什么被折叠?



