反转链表 II(Reverse Linked List II)java_leetcode_92
版权©: https://blog.youkuaiyun.com/zhangjingao/article/details/96965748
题干
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
题解
这个题其实思路我相信经常刷算法的人都是有的,就是分为三个步骤。
- 第一步:找到m的位置,记住m之前的一个链表节点,这个作为前面的部分prehead。
- 第二步:new一个新的节点newListNode,指向null,之后从链表的第m个节点到第n个节点,每一个节点都指向newListNode,然后newListNode再等于newListNode.next。这样就保证了最后到n的时候拿到的是反转后的头节点,然后将第一步的prehead指向这个newListNode,此时结果就是前面的部分加上反转后的部分。
- 第三步:将链表剩余的部门接在newListNode的最后,作为最后一部分。
代码
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null || head.next == null || n == m) {
return head;
}
ListNode result = head;
ListNode preHead = null;
int index = 1;
ListNode newHead = null;
//首先判断是开头是1还是中间的值开始反转
if (m == 1) {
while (index++ <= n) {
ListNode temp = head;
head = head.next;
temp.next = newHead;
newHead = temp;
}
result = newHead;
} else {
//首先遍历到需要反转的节点
while (index < m) {
index++;
preHead = head;
head = head.next;
}
//开始翻转
while (index++ <= n) {
ListNode temp = head;
head = head.next;
temp.next = newHead;
newHead = temp;
}
//反转后将翻转开始前的节点衔接上反转后的节点头
if (preHead != null) {
preHead.next = newHead;
}
newHead = preHead;
}
ListNode tempHead = result;
if (newHead != null) {
while (tempHead.next != null) {
tempHead = tempHead.next;
}
tempHead.next = head;
}
return result;
}