L92反轉鍊錶 II

2021-10-05 10:24:51 字數 1774 閱讀 4450

反轉鍊錶 ii

反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。

說明:1 ≤ m ≤ n ≤ 鍊錶長度。

示例:輸入: 1->2->3->4->5->null, m = 2, n = 4

輸出: 1->4->3->2->5->null

遞推法

/**

* definition for singly-linked list.

* public class listnode

* }*/class

solution

listnode last =

reversen

(head.next, n -1)

;//返回的是頭結點

head.next.next = head;

//分為三個部分,頭結點,n -1個節點,剩餘的部分,三者最後要連起來

//鏈結第乙個與 n - 1個節點

head.next = succ;

//區別就在於不再是null

//鏈結前n個節點與後面的節點

return last;

}public listnode reversebetween

(listnode head,

int m,

int n)

head.next =

reversebetween

(head.next, m -

1, n -1)

;//注意這個時候首先必然不是在head,因為m != 1

return head;

}}

2.迭代方法

自己錯誤方法,能夠通過30/40

主要是少考慮m ==1時,這個時候直接return head是有問題的,head已經發生了變化

[3,5]22

對於這樣的m=n,同時還在尾部,也是不成立的

class

solution

cnt++

; cur = cur.next;

} start = pre.next;

//m = 1,start也取不到正確的值

listnode next = cur.next;

//如果m=n且都在尾部,這個時候就會空指標異常

listnode n1, n2, n3;

n1 = null;

n2 = start;

n3 = null;

while

(n2 != next)

pre.next = end;

start.next = next;

return head;

}}

改進方法

class

solution

//原來是想一次確定該單元的前後連線點,這樣需要考慮的特殊情況就比較多

//還需要移動n次,不確定可以畫圖試試

listnode n1, n2, n3;

n1 = prev;

//n1 = null//一樣

n2 = cur;

n3 = null;

while

(n >0)

//腦子裡要明確迴圈結束時,n1,n2的位置

= n2;不能直接寫,prev有可能為null

if(prev == null)

else

cur.next = n2;

return head;

}}

92 反轉鍊錶 II

反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4輸出 1 4 3 2 5 null definition for singly linked list.struct listnode class soluti...

92 反轉鍊錶 II

題目描述 反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4 輸出 1 4 3 2 5 null 方法1 主要思路 1 直觀的想,找出要反轉的一段的鍊錶的頭乙個結點的前乙個結點,使用頭插法,將該段鍊錶中的結點,...

92 反轉鍊錶 II

92.反轉鍊錶 ii 難度中等425收藏分享切換為英文關注反饋 反轉從位置 m 到 n 的鍊錶。請使用一趟掃瞄完成反轉。說明 1 m n 鍊錶長度。示例 輸入 1 2 3 4 5 null,m 2,n 4輸出 1 4 3 2 5 nullpublic static listnode reverseb...