leetcode92. Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
Subscribe to see which companies asked this question.

思路:将中间部分的链表逆序即可。

总结: 对于链表的操作,可以加个头结点使得操作更加的方便。

我的方案:
public static ListNode solution(ListNode head, int m, int n) {

        if (n == m)
            return head;


        ListNode prev, current;
        prev = current =head;
        if (m == 1) {                                   
        // 为链表设置个头结点, 更容易操作,主要是这里需要对m==1时 prev进行定义。 我们可以就加头结点,不区分m是否=1
            prev = new ListNode(0);
            prev.next = head;
            head = prev;
        }

        int i =1;
        for (;i<m;i++)
        {
            prev = current;
            current = current.next;
        }
        ListNode tmp = current;

        while (i++!=n)
        {
            current = tmp.next;
            tmp.next = current.next;
            current.next = prev.next;
            prev.next = current;

            //对中间部分翻转,注意指针操作的顺序,画图可以更清晰
        }

        if (m == 1)
            return head.next;
        return head;



    }
public ListNode reverseBetween(ListNode head, int m, int n) {
    if(head == null) return null;
    ListNode dummy = new ListNode(0); 
    // create a dummy node to mark the head of this list
    dummy.next = head;
    // make a pointer pre as a marker for the node before reversing
    for(int i = 0; i<m-1; i++) pre = pre.next;

    ListNode start = pre.next; // a pointer to the beginning of a sub-list that will be reversed
    ListNode then = start.next; // a pointer to a node that will be reversed

    // 1 - 2 -3 - 4 - 5 ; m=2; n =4 ---> pre = 1, start = 2, then = 3
    // dummy-> 1 -> 2 -> 3 -> 4 -> 5

    for(int i=0; i<n-m; i++)
    {
        start.next = then.next;
        then.next = pre.next;
        pre.next = then;
        then = start.next;
    }

    // first reversing : dummy->1 - 3 - 2 - 4 - 5; pre = 1, start = 2, then = 4
    // second reversing: dummy->1 - 4 - 3 - 2 - 5; pre = 1, start = 2, then = 5 (finish)

    return dummy.next;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值