變形的鍊錶反轉

2021-10-24 13:15:27 字數 2642 閱讀 4768

給定乙個單鏈表的頭節點 head,實現乙個調整單鏈表的函式,使得每k個節點之間為一組進行逆序,並且從鍊錶的尾部開始組起,頭部剩餘節點數量不夠一組的不需要逆序。(不能使用佇列或者棧作為輔助)

例如:鍊錶:1->2->3->4->5->6->7->8->null, k = 3。那麼 6->7->8,3->4->5,1->2各位一組。調整後:1->2->5->4->3->8->7->6->null。其中 1,2不調整,因為不夠一組。

這道題的難點在於,是從鍊錶的尾部開始組起的,而不是從鍊錶的頭部,如果是頭部的話,那我們還是比較容易做的,因為你可以遍歷鍊錶,每遍歷 k 個就拆分為一組來逆序。但是從尾部的話就不一樣了,因為是單鏈表,不能往後遍歷組起。不過這道題肯定是用遞迴比較好做這篇文章寫了關於遞迴的一些套路。

在做這道題之前,我們不仿先來看看如果從頭部開始組起的話,應該怎麼做呢?例如:鍊錶:1->2->3->4->5->6->7->8->null, k = 3。調整後:3->2->1->6->5->4->7->8->null。其中 7,8不調整,因為不夠一組。

這道題我們可以用遞迴來實現,假設方法reverseknode()的功能是將單鏈表的每k個節點之間逆序(從頭部開始組起的哦);reverse()方法的功能是將乙個單鏈表逆序。

那麼對於下面的這個單鏈表,其中 k = 3。

我們把前k個節點與後面的節點分割出來:

temp指向的剩餘的鍊錶,可以說是原問題的乙個子問題。

我們可以呼叫reverseknode()方法將temp指向的鍊錶每k個節點之間進行逆序。

再呼叫reverse()方法把head指向的那3個節點進行逆序,結果如下:

接著,我們只需要把這兩部分給連線起來就可以了。最後的結果如下:

//k個為一組逆序

public listnode reversekgroup

(listnode head,

int k)

//判斷節點的數量是否能夠湊成一組

if(temp == null)

return head;

listnode t2 = temp.next;

temp.next = null;

//把當前的組進行逆序

listnode newhead =

reverselist

(head)

;//把之後的節點進行分組逆序

listnode newtemp =

reversekgroup

(t2, k)

;// 把兩部分連線起來

head.next = newtemp;

return newhead;

}//逆序單鏈表

private

static listnode reverselist

(listnode head)

這兩道題可以說是及其相似的了,只是一道從頭部開始組起,這道從頭部開始組起的,也是 leetcode 的第 25 題。而面試的時候,經常會進行變形,例如這道位元組跳動的題,它變成從尾部開始組起,可能你一時之間就不知道該怎麼弄了。當然,可能有人一下子就反應出來,把他秒殺了。

其實這道題很好做滴,你只需要先把單鏈表進行一次逆序,逆序之後就能轉化為從頭部開始組起了,然後按照我上面的解法,處理完之後,把結果再次逆序即搞定。兩次逆序相當於沒逆序。

例如對於鍊錶(其中 k = 3)

我們把它從尾部開始組起,每 k 個節點為一組進行逆序。

步驟如下:

1、先進行逆序

逆序之後就可以把問題轉化為從頭部開始組起,每 k 個節點為一組進行逆序。

2、處理後的結果如下

3、接著在把結果逆序一次,結果如下

**如下:

public listnode solve

(listnode head,

int k)

類似於這種需要先進行逆序的還要兩個鍊錶相加,這道題位元組跳動的筆試題也有出過,如下圖的第二題:

這道題就需要先把兩個鍊錶逆序,再節點間相加,最後在合併了。

總結關於鍊錶的演算法題,在面試的時候聽說是挺常考的,大家可以多注意注意。

鍊錶 反轉鍊錶

問題 兩兩交換鍊錶中的節點 問題 k 個一組翻轉鍊錶 問題鏈結 利用棧先進後出的特性,遍歷鍊錶,將每個結點加入棧中,最後進行出棧操作,先出棧的結點指向臨近的後出棧的結點。definition for singly linked list.struct listnode class solution ...

反轉鍊錶與分組反轉鍊錶

經典的反轉鍊錶,先上 public class listnode public class printlist system.out.println public class reverse public listnode reverse listnode root listnode pre nul...

鍊錶的反轉

鍊錶的反轉是乙個經常被問到的乙個面試題,也是乙個非常基礎的問題。比如乙個鍊錶是這樣的 1 2 3 4 5 通過反轉後成為5 4 3 2 1。最容易想到的方法遍歷一遍鍊錶,利用乙個輔助指標,儲存遍歷過程中當前指標指向的下乙個元素,然後將當前節點元素的指標反轉後,利用已經儲存的指標往後面繼續遍歷。源 如...