題目描述:在單鏈表中輸出倒數第k個節點
要求:如果鍊錶長為n,時間複雜度為o(n),額外空間複雜度達到o(1)
思路:當我們用num來表示鍊錶中節點個數,當我們輸出節點的時候會出現三種情況:
不存在第k個節點,此時返回空(num第k個節點就是第乙個節點,操作較容易(num==k);
第k個節點在鍊錶中(num>k),此時輸出倒數第k個節點相當於輸出第(num-k+1)個節點;
除了我們可遍歷兩次鍊錶第一次記錄下倒數k的位置這種方法,我們還可通過定義兩個指標實現只遍歷一次就可找到倒數第k位置:第乙個指標從煉表頭節點開始遍歷k-1步,此時第二人個指標不動;從第k步開始第二個指標也從煉表頭指標開始向後遍歷,此時兩個指標的距離為k-1,當第乙個指標到達鍊錶尾時,第二個指標指向的就是倒數第k個節點。
/*
struct listnode
};*/
class solution
pbehind = plisthead;
while
(pahead->next != nullptr)
return pbbehind;
}}
題目描述:給定煉表頭節點head,實現刪除鍊錶的中間節點。例:
要求:如果鍊錶長為n,時間複雜度為o(n),額外空間複雜度達到o(1)
思路:首先我們還是要考慮特殊情況,當給定的頭指標為空指標,或者只有只有乙個節點的時候,直接返回頭節點即可;借鑑上面的方法,我們可知道可以通過快慢指標進行一次鍊錶遍歷後找到要刪除的節點:快指標一次遍歷兩個節點,慢指標一次遍歷乙個節點,當快指標遍歷完後,慢指標所指向的節點就為要刪除的節點:
class solution
slow.next = slow.next.next
return head;
}}
題目描述:反轉給定的單鏈表。例:
要求:如果鍊錶長為n,時間複雜度為o(n),額外空間複雜度達到o(1)
思路:當我們調整當前節點,使他的next指向它的前驅,不過在做該操作時需要注意儲存該節點的原next防止鍊錶斷裂,以你我們可設定三個指標,分別指向當前節點、前乙個節點和後乙個節點:
/*
struct listnode
};*/
class solution
return preversedhead;}}
;
這種遞迴雖然簡潔但是很不好理解,遞迴的兩個條件:
終止條件是大觀前街店或下乙個節點==null
在函式內部,改變結點的指向,就是下面的
head->next->next = head;
該方法可結合幻燈片理解:推薦:動畫演示+多種解法 面試題24. 反轉鍊錶
/**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
};
鍊錶經典問題彙總
原帖位址 收集了一下鍊錶常見的面試題 1 如何判斷乙個單鏈表有環 2 如何判斷乙個環的入口點在 3 如何知道環的長度 4 如何知道兩個單鏈表 無環 是否相交 5 如果兩個單鏈表 無環 相交,如何知道它們相交的第乙個節點是什麼 6 如何知道兩個單鏈表 有環 是否相交 7 如果兩個單鏈表 有環 相交,如...
鍊錶的經典問題
如果兩個單鏈表相交,那應該呈 y 字形,也就是從交點以後的部分是兩個鍊錶的公共節點。所以,判斷是否相交只要看兩個鍊錶的最後乙個節點是否為同乙個即可。那麼如何找到交點呢?設兩個單鏈表的長度分別為l1 l2,假設l1 l2 則 l1 l2 的值就是交匯之前兩個鍊錶的長度差 因此,只有讓更長的鍊錶先走l1...
鍊錶及經典問題
鍊錶及經典問題 鍊錶及經典問題 第一周 鍊錶及經典問題 1 鍊錶的基礎知識鍊錶的結構 訪問鍊錶的時間複雜度幾種經典的鍊錶實現方法 2 鍊錶的典型應用場景 3 經典面試題鍊錶的訪問鍊錶的反轉 鍊錶的節點刪除 4 彩蛋習題及相關說明 1 鍊錶的基礎知識 鍊錶的結構 節點資料域指標域 實現方式包括位址 下...