您的位置:首页 > 其它

92. Reverse Linked List II

2017-10-31 09:41 309 查看


这道题是翻转链表的第m到第n个节点。

对于这种链表的指针问题总是处理不好。这道题的方法是,把链表分为三个部分,m之前,m到n, n之后,最后把这三部分串起来。要用到几个中间指针:

(1)第一部分:(newhead)->---------->(pre)

(2)第二部分:(front)->---------->(last)

(3)第三部分:(pre)--------

首先用cur指针遍历链表,让cur指向第m个之前的那个节点,则pre就是cur,cur->next就是第m个节点,则这个节点是翻转后的last指针。然后用cur继续往后遍历,每遍历一个,就把他拿出来,让pre->next指向他的下一个,就把他和pre之间的连接切断了,然后让cur的next等于front,front指向刚刚被拿出来的节点,那么cur和原链表右边也被切断了,连到了front上,然后让front等于cur,供下一个拿出来的数连接。直到cur遍历到第n个节点的时候,原链表被分成了两个链表,可以看做上面的三个部分,用题目给的例子就是:

(1)-1->1->5->NULL(其中-1是我们新增的头结点)

(2)4->3->2->NULL

这时候front指向4,pre指向1,last指向2,就让last->next = pre->next;把m到n这一段的后面连起来,然后pre->next = front;把前面连起来,就完成了。

/**
* 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) {
ListNode* newhead = new ListNode(-1);
newhead->next = head;

ListNode* pre, *last, *front, *cur = newhead;
for(int i = 0; i < m-1; ++i){
cur = cur->next;
}
pre = cur;
last = cur->next;
for(int i = 0; i < n - m + 1; ++i){
cur = pre->next;
pre->next = cur->next;
cur->next = front;
front = cur;
}
last->next = pre->next;
pre->next = front;
return newhead->next;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: