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.
题目大意就是给一个单链表,给定一个起点和一个终点,反转起点和终点之间的链表,要求:原地反转,一次遍历。
解题思路:因为已经限制了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; }