反轉鏈表 II(Reverse Linked List II)java_leetcode_92
版權©: https://blog.csdn.net/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;
}