反轉鍊錶 清晰易懂的兩種方法

2021-10-25 18:31:32 字數 1192 閱讀 5872

反轉乙個單鏈表。如下示例::

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

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

public class listnode 

}

一、 迭代法:

注意觀察示例:1->2->3->4->5->null的反轉可以看成:null<-1<-2<-3<-4<-5。

會發現鍊錶的反轉基本上就是箭頭的方向的反轉,即節點前驅和後繼互換角色。

我們定義三個變數cur,pre和next分別表示當前節點,以及其前驅後繼。cur初始化為head,其他初始化為null。

我們從頭節點1開始遍歷,1的next和pre原來分別是2和null(初始值)互換後1的next和pre變成null和2,依次這樣遍歷下去。

注意最後應該返回pre,不是cur。遍歷結束後cur的值是null。

**如下:

public listnode reverselist(listnode head)

return pre;

}

方法2:頭插法

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

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

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

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

//頭插法 每次把cur.next那個節點放在頭部

//m = 1, n = length的時候全部反轉(直到cur.next為空)

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

listnode n = reverselist(head.next);

head.next.next = head;是反轉鍊錶的末尾

head.next = null;

return n;

}

只是注意兩個地方:

如果head是空或者遍歷到最後節點的時候,應該返回head。

**5,6行。節點替換的時候不要用n來代替head->next;因為對於遞迴來說它們不是等價的。但是head->next->next 等價於 n->next。

206 反轉鍊錶(兩種方法 迭代和遞迴)

解題思路 1.迭代 建立乙個新的鍊錶的啞巴節點root,建立乙個過度指標n,使用頭插法將head鍊錶中的元素取出插入root鍊錶中,返回root.next class solution listnode root new listnode 0 listnode n null while head n...

演算法學習 反轉鍊錶的兩種方法 棧 遞迴

給出乙個鍊錶,返回鍊錶的反轉,例如 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 這個做法是比較先想到的,棧的先進後出的特點能很好地幫助我們實現反轉,步驟也比較簡單,就是空間複雜度是o n 所以其實這種做法是不太好的 public listnode reverse1 lis...

靜態鍊錶實現的兩種方法

物件的多陣列表示 用三個陣列next key prev 分別表示鍊錶的後繼 資料 前驅。以下的 分別展示了基本的字典操作和如何申請分配記憶體。由於有些語言不支援指標,所以我們可以用多陣列表示的靜態雙鏈表。include include include using namespace std defi...