题目:
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.
需要反转m到n个点,按照前面的思路,我们需要记录第m-1个节点,从m+1个节点到第n个节点依次插入到m-1个节点之后,当m为头节点时,这时候就不存在第m-1个节点,因此我们构造一个fakeNode节点使它的下一个节点就是头节点。
代码:
<strong> </strong>public static ListNode reverseBetween(ListNode head, int m, int n) {
if(head==null||head.next==null||m==n)//链表只有0或1个节点或是只要求反转一个节点,直接返回原表头
return head;
ListNode fakeNode=new ListNode(-1);//头节点之前的一个点
fakeNode.next=head;//它的下一个节点就是头结点
ListNode cur=head;//记录遍历的当前节点
ListNode pre=fakeNode;//用来记录当前节点的前一个节点
int countNum=1;//用来记录链表的第几个几点
while(countNum<=m-1)
{
cur=cur.next;
pre=pre.next;
countNum++;
}
ListNode mNode=cur;//记录第m个节点
cur=cur.next;//cur指向第m+1个点
countNum=m+1;//countNum此时记录到第m+1个节点
ListNode next=null;//保存下一个需要遍历的节点
while(countNum<=n)
{
next=cur.next;//保存下一个需要遍历的节点
cur.next=pre.next;
pre.next=cur;
cur=next;
countNum++;
}
mNode.next=next;//节点m指向节点n+1;
return fakeNode.next;
}
需要注意的一点就是要记录第m个节点,并在反转完成之后,将它指向n+1个节点