本題為leetcode探索初級演算法中煉表章節的一題
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。
示例:給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.
說明:
給定的 n 保證是有效的。
高階:你能嘗試使用一趟掃瞄實現嗎?
/**
* definition for singly-linked list.
* public class listnode
* }*/class solution
if(n == length)
listnode removeprehead = head;
while(length != n + 1)
removeprehead.next = removeprehead.next.next;
return head;}}
思路就是第一次迴圈得到長度,知道長度後刪除倒數第n個就容易了。總共迴圈了兩次,未能達到高階要求。
解法一:
複雜度分析:
時間複雜度:o(l)o(l),該演算法對列表進行了兩次遍歷,首先計算了列表的長度 ll 其次找到第 (l - n)(l−n) 個結點。 操作執行了 2l-n2l−n 步,時間複雜度為 o(l)o(l)。
空間複雜度:o(1)o(1),我們只用了常量級的額外空間。
跟我的思路大致相同,官方中使用了啞結點作為輔助,有效的避免極端情況,而我都是通過提前判斷來實現的。
解法二:
}複雜度分析:
時間複雜度:o(l)o(l),該演算法對含有 ll 個結點的列表進行了一次遍歷。因此時間複雜度為 o(l)o(l)。
空間複雜度:o(1)o(1),我們只用了常量級的額外空間。
解法二使用兩個指標先讓第乙個指標a移動n個距離,在兩個指標一起移動,直到指標a移動到結尾。非常巧妙,學習了!
Leet Code演算法題(反轉鍊錶)
c 解題思路,如何反轉乙個鍊錶 將head放到最後一位 head next作為head 重複操作 看 首先這是乙個鍊錶 定義幾個指標 listnode prep null,curp head,nextp head next 然後執行 curp next prep 將head放到最後 prep cur...
LeetCode演算法題 環形鍊錶
給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。示例 2 輸入...
leetcode演算法題 重排鍊錶
1 map void reorderlist listnode head for int i 0,j n 1 i,j 2 遞迴 void reorderlist listnode head int len 0 listnode p head while p null reorderlisthelpe...