闲话链表(二) leetcode 之 Reverse Linked List II
2014-10-12 20:54
495 查看
leetcode出处:https://oj.leetcode.com/problems/reverse-linked-list-ii/
描述
Reverse a linked list from position m to n.Do it in-place and in one-pass.
For example: Given1->2->3->4->5->nullptr, m = 2 and n = 4,
return1->4->3->2->5->nullptr.
Note: Given m, n satisfy the followingcondition: 1 <=m<= n<= length of list.
分析:大致思路是找到第m-1个节点,然后以其为head2,将第m个节点到第n个节点分别进行头插法。
但是链表有很多例外情况。比如m可能为1,那找第m-1个节点的程序是否满足m=1的情况。为了处理这种情况,我们添加一个fakehead节点作为表头。这是一种很方便的策略,能够有效避免指针访问非法空间的情况。
代码:
描述
Reverse a linked list from position m to n.Do it in-place and in one-pass.
For example: Given1->2->3->4->5->nullptr, m = 2 and n = 4,
return1->4->3->2->5->nullptr.
Note: Given m, n satisfy the followingcondition: 1 <=m<= n<= length of list.
分析:大致思路是找到第m-1个节点,然后以其为head2,将第m个节点到第n个节点分别进行头插法。
但是链表有很多例外情况。比如m可能为1,那找第m-1个节点的程序是否满足m=1的情况。为了处理这种情况,我们添加一个fakehead节点作为表头。这是一种很方便的策略,能够有效避免指针访问非法空间的情况。
代码:
<span style="font-size:18px;">#include <iostream> 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 *fakehead = new ListNode(-1); fakehead -> next = head; ListNode *prev = fakehead; for(int i = 1; i < m; ++ i) prev = prev -> next; ListNode *head2 = prev; //找到第m-1个节点,作为head2,在这里开始头插 prev = prev -> next; //第一个节点不必头插,prev指向当前处理节点的前一个 ListNode *cur = prev -> next; //cur表示当前处理的节点 //开始头插 从第m+1个节点到第n个节点 for(int i = m + 1; i <=n; ++ i) { prev -> next = cur -> next; //链表不断,为了之后更新cur // 将cur插入head2 后 cur -> next = head2 -> next; head2 -> next = cur; cur = prev -> next; // 更新cur,使其指向下一个要处理的 } return fakehead -> next; } };</span>
相关文章推荐
- 【leetcode】【单链表】【92】Reverse Linked List II
- Reverse Linked List II 局部翻转链表@LeetCode
- leetcode:单链表之Reverse Linked List II
- [LeetCode-92] Reverse Linked List II(反转指定区间链表)
- [Leetcode] Reverse linked list ii 反转链表
- LeetCode-Reverse Linked List II(反转链表)
- leetcode——Reverse Linked List II 选择链表中部分节点逆序(AC)
- (Leetcode)92. Reverse Linked List II ——反转单链表
- LeetCode 92. Reverse Linked List II(翻转链表)
- Leetcode Reverse Linked List II 反转特定区间的链表
- LeetCode | Reverse Linked List II(翻转链表2)
- Leetcode:Reverse Linked List II 单链表区间范围内逆置
- LeetCode之“链表”:Reverse Linked List && Reverse Linked List II
- leetcode之92. Reverse Linked List II(C++读错题版本,交换一个链表中指定的两个位置上的元素)
- [LeetCode] Reverse Linked List II 倒置链表之二
- [leetcode]Reverse Linked List II (反转链表值 C语言实现)
- C实现 LeetCode->Reverse Linked List II (双指针大法)(单链表反转)
- leetcode_c++:链表:Reverse Linked List II (092)
- leetcode:Reverse Linked List II (反转链表中的一部分)【面试算法题】
- [LeetCode] Reverse Linked List I II - 链表翻转问题