您的位置:首页 > 其它

闲话链表(二) 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节点作为表头。这是一种很方便的策略,能够有效避免指针访问非法空间的情况。

代码:

<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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: