反轉乙個單鏈表。如下示例::
輸入: 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...