题目描述
Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL
思路
反转链表的方法是不断地将后面的指针指向前面。一种想法是找出翻转段的前一个节点tmpHead和后一个节点tmpTail,将该段翻转后,tmpHead指向翻转段原先的最后一个节点,tmpTail指向原先的第一个节点。
使用一个节点保存下一个待翻转节点,然后对当前的节点进行翻转:
1、先将q->next保存为tmp
2、然后将q->next指向p
3、移动p、q。
注意:翻转段包含链表头尾、翻转段只包含一个或两个节点,链表只包含一个或两个节点等特殊情况的处理
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (n == m || head->next == NULL)return head;
ListNode *tmpTail;
ListNode*tmpHead = new ListNode(0);
tmpHead->next = tmpTail = head;
for(int i=0;i<n;i++)
{
tmpTail = tmpTail->next;
}
for(int i=0;i<m-1;i++)
{
tmpHead = tmpHead->next;
}
ListNode*p = tmpHead->next;
ListNode*q = tmpHead->next->next;
ListNode*tmp = q->next;
for (int i = 0; i<n-m; i++)
{
q->next = p;
p = q;
q = tmp;
if (q)tmp = q->next;
}
tmpHead->next->next = tmpTail;
tmpHead->next = p;
if (m==1)
return tmpHead->next;
return head;
}
};
不怕慢,就怕站。