Reverse Linked List II——LeetCode

 

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->NULLm = 2 and n = 4,

return 1->4->3->2->5->NULL.

Note:
Given mn satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

 

题目大意就是给一个单链表,给定一个起点和一个终点,反转起点和终点之间的链表,要求:原地反转,一次遍历。

解题思路:因为已经限制了1 ≤ m ≤ n ≤ length of list,设定头节点指向第一个元素,工作指针先走m步,采用头插法来重新构建m到n之间的数据,最后把m位置上的next指针指向原来的n+1的位置。

这次代码写的有点纠结,Java操作这些不如c++熟练。

public ListNode reverseBetween(ListNode head, int m, int n) {

        if (head == null || m == n) {

            return head;

        }

        int count = n - m;

        ListNode p = new ListNode(0);

        ListNode q;

        ListNode headp = new ListNode(0);

        ListNode res = headp;

        p.next = head;

        headp.next = head;

        while (--m > 0) {

            headp = headp.next;

        }

        p = headp.next;

        q = p.next;

        ListNode last = p;

        headp.next = null;

        while (count-- >= 0) {

            p.next = headp.next;

            headp.next = p;

            if (q != null) {

                p = q;

                q = q.next;

            } else {

                p = null;

            }

        }

        last.next = p;

        /*while(res!=null){

            System.out.println(res.val);

            res=res.next;

        }*/

        return res.next;

    }

 

你可能感兴趣的:(LeetCode)