您的位置:首页 > 其它

[LeetCode]Reverse Linked List II

2014-05-29 17:55 274 查看

题目描述

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]之间的节点逆转。

解题思路

关键点有四个,1.第m-1个点,2.第m个点,3.第n个点,4.第n+1个点;

将其中的[m,n]段逆转,需要注意当m为1时的情况。

代码

public static ListNode reverseBetween(ListNode head, int m, int n) {
ListNode beforeMthNode = null;
ListNode tailBetweenNode = null;
ListNode headBetweenNode = null;
ListNode loopNode = head;
ListNode preNode = null, followNode = null;
ListNode newHead = head;

// [1,m-1]段
for (int i = 1; i < m && loopNode != null; i++) {
beforeMthNode = loopNode;
loopNode = loopNode.next;
}

// 第m个节点
tailBetweenNode = loopNode;

// 逆转[m,n]段
for (int i = m; i <= n && loopNode != null; i++) {
preNode = loopNode;
loopNode = loopNode.next;
preNode.next = followNode;
followNode = preNode;
}

// [m,n]段逆转后的头节点
headBetweenNode = preNode;

if (beforeMthNode == null) {
// 如果m==1,则逆转段的头节点为新的头节点
newHead = headBetweenNode;
} else {
// 如果m!=1,则第m-1个节点指向逆转段的新的头节点
beforeMthNode.next = headBetweenNode;
}

// 逆转段的尾节点指向剩余的链表
tailBetweenNode.next = loopNode;
return newHead;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: