題目資訊
反轉乙個單鏈表。
示例:
輸入: 1->2->3->4->5->null
輸出: 5->4->3->2->1->null
高階:你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?
解法一:迭代
反轉乙個鍊錶和陣列是不一樣的,因為不能任意取值,只能說按照next的順序依次往後放。那麼把乙個節點往後放的過程就是一次迭代
}解法二:遞迴
有了這樣乙個迭代,我們可以去轉一下遞迴。在迭代當中我們去設定了頭結點的next為空,之後的next都是推導的,反過來它是我們的遞迴出口
我們通過reverselistc傳入頭結點,完成整個鍊錶的反轉。如果我們傳入頭結點的next呢,那麼就從圖中值為4的節點開始反轉得到如下圖,最終要實現真正的反轉把4節點指向5節點並且5節點指向null。
public listnode reverselist(listnode head)
listnode cur = reverselist(head.next);
//最後操作 4指向5,且5指向null
head.next.next = head;
head.next = null;
return cur;
}
解法三:棧
解這一題棧也是可以用,我們迭代順著從頭結點開始,把自己作為下乙個被指向。如果倒著取先從最後節點開始把它的next指向前乙個節點。但是對於這個單向鍊錶找下乙個next就可以取到,但找前乙個取不到。
//依次出棧,next為下乙個
while (!stack.isempty())
//處理最後乙個next為null,否則成環
cur.next = null;
return newhead;
}總結
解法二關於遞迴的改造作為演算法學習還是可以多練習的,解法一正向遍歷+過程反向(每個把自己作為後乙個也就是下乙個在前面)解法三反向遍歷+過程正向(每個都是前乙個它的next就是下乙個),總體來說解法一最優,解法二與三練習其他資料結構以及其他演算法思想擴充套件思路
LeetCode初級演算法之鍊錶 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?思路一 借助外來的空間 這個題我的初步思路是借助外來的空間,也就不是o 1 的空間複雜度,那麼這個就比較簡單了,只...
leetcode初級演算法 鍊錶
題目源自leetcode,方法都是自 cai 己 ji 寫的,可能比較符合菜雞們的思路 鍊錶是做到現在,感覺自己最拉垮的一節,資料結構真的都還給老師了 請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點。傳入函式的唯一引數為 要被刪除的節點 示例 1 輸入 head 4,5,1,9 node...
LeetCode 初級演算法 環形鍊錶
給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。示例 2 輸...