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.
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { /*The idea is stright forward. There needs an safe head guard. 1 calculate the number that needs to reverse 2 find the start position to reverse. 3. iterative reverse two node(Use two pointer)*/ ListNode newHead=new ListNode(-1);//安全头节点 newHead.next=head; ListNode p1=head; ListNode last=newHead; int t=n-m; while(m>1){ p1=p1.next; last=last.next; m--; } ListNode rear=last; ListNode temp=p1; p1=p1.next; last=last.next; ListNode p2=p1; while(t>0){ p2=p1.next; p1.next=last; last=p1; p1=p2; t--; } rear.next=last; temp.next=p1; return newHead.next; } }
时间: 2024-11-05 18:41:16