题目意思: 翻转给定区间[m,n]的链表。 第一个节点m=1。 1<=m<=n<=length。
解题思路: 就我目前学习到的,有用指向指针的指针的,有插入,有逆转的。但是所有方法的核心,都其实是一个算法,就是利用3个指针修改区间内的节点的next值,且要保证已修改的链表是可以被找到的,即可以连入原链表中。 假设有一个链表有1,2,3,4,5,6,6个节点。m=2,n=5。 我们添加一个dummy节点,方便操作第一个节点。 首先让pre指向第m个节点前面那个,cur指向第m个节点,p1指向m的下一个节点,因为p1有可能是NULL,所以当p1不是NULL的时候,p2指向p1的下一个节点。 上图画出了这几个指针指向情况的开始状态和我们希望的终止状态。 在最终状态下,再通过其中方框中的两步就可以我们需要的链表了。
而cur,p1,p2三个指针在区间内向前移动并且将p1的next指向cur的过程则包含在一个for循环内部。如下:
代码如下: 1 class Solution { 2 public: 3 ListNode *reverseBetween(ListNode *head, int m, int n) { 4 ListNode *dummy = new ListNode(0); 5 dummy->next = head; 6 7 ListNode *pre = dummy, *cur = head; 8 for(int i = 1; i < m; i++){ 9 pre = cur; 10 cur = cur->next; 11 } 12 13 ListNode *p1,*p2; 14 if(cur) 15 p1 = cur->next; 16 if(p1) 17 p2 = p1->next; 18 for(int j = m; j < n; j++){ 19 p1->next = cur; 20 cur = p1; 21 p1 = p2; 22 if(p2) p2 = p2->next; 23 } 24 pre->next->next = p1; 25 pre->next = cur; 26 27 return dummy->next; 28 } 29 };
分类: Leetcode 解题 |
|
来自: 雪柳花明 > 《LeetCode》