反轉單鏈表中的子鍊錶(優化版 java實現)

2021-09-12 14:21:02 字數 1211 閱讀 3672

之前的解題辦法是:先拆解原鍊錶,反轉後再將鍊錶拼接起來。雖然能成功將部分子鍊錶反轉,並且思路不複雜,但其實現過程中,**量較多,而且需要求得的引數也比較多(我在實現整個反轉過程的時候,花了不少時間)。因此很容易混亂,看花眼,導致**的可讀性也是相當差。所以我在一番思索之後,對這個過程做了一些優化。以下是優化後的思路的實現過程。

題目描述:

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

說明:

1 ≤ m ≤ n ≤ 鍊錶長度。

示例:

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

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

解題思路:

因為我在反轉鍊錶的時候,先虛擬了乙個頭節點(dummyhead),這個虛擬頭節點的下乙個節點,指向真正的頭節點(head)。反轉的時候,虛擬頭節點位置始終不變,所以真正的頭節點的上乙個節點,也是始終不變的。這時候就可以利用引數m找到子鍊錶的頭節點和它的上乙個節點。

反轉的時候,子鍊錶的上乙個節點的位置始終不變。(子鍊錶就是需要反轉的鍊錶)

再利用引數n,找到子鍊錶的尾節點。並且停止反轉。這時候,子煉表尾節點後面的節點,次序也是沒有改變的。

最終返回真正的頭節點(虛擬頭節點的下乙個節點);

解題**:

public static listnode reversebetween(listnode head, int m, int n) 

listnode dummyhead = new listnode(-1);

dummyhead.next = head;

//temp始終為需要反轉的煉表頭節點的上乙個節點

listnode temp = dummyhead;

int i = 1;

while (i < m)

//找到需要反轉的鍊錶的頭節點f

listnode f = temp.next;

//找到需要反轉的鍊錶的第二個節點s

listnode s = f.next;

while (i < n && s != null)

return dummyhead.next;

}

鍊錶 將單鏈表反轉

todo 將單鏈表反轉 1.先定義乙個結點 2.從頭到尾遍歷原來的鍊錶,每遍歷乙個節點,就將其取出,並放在新的鍊錶的最前端 param head public static void reverse heronode head 原來的鍊錶 heronode temp head.next 當前結點的下...

就地鍊錶反轉 單鏈表反轉總結篇

單鏈表的反轉是常見的面試題目。本文總結了2種方法。1 定義 單鏈表node的資料結構定義如下 class listnode 15 return dummy.next 16 2.4 總結 1個頭結點,2個指標,4行 注意初始狀態和結束狀態,體會中間的 過程。3 方法2 新建鍊錶,頭節點插入法 3.1 ...

206 反轉鍊錶 反轉乙個單鏈表。

題解一 迭代法 在遍歷鍊錶時,將當前節點的 next 指標改為指向前乙個節點。由於節點沒有引用其前乙個節點,因此必須事先儲存其前乙個節點pre。在更改引用之前,還需要儲存後乙個節點。最後返回新的頭引用。definition for singly linked list.struct listnode...