1. 程式人生 > >leetcode總結無止境系列之連結串列

leetcode總結無止境系列之連結串列

//dummy head的使用示例
ListNode* ProcessList(ListNode* head){
    ListNode* dummy = new ListNode();
    dummy->next = head;
    //process the list
    head = dummy->next;
    delete dummy;//再提醒一次,請記得delete
    return head; 
}
 
//指標的指標用法示例
ListNode* ProcessList(ListNode* head){
    ListNode** pNode = &head;
    //process the list
    //每次將處理得到的pCur連到新連結串列pNode上
    return head;
}

連結串列常考題

題一、 給定單鏈表,檢測是否有環
思路:(快慢指標)使用兩個指標p1,p2從連結串列頭開始遍歷,p1每次前進一步,p2每次前進兩步。如果p2到達連結串列尾部,說明無環,否則p1、p2必然會在某個時刻相遇(p1==p2),從而檢測到連結串列中有環。

題二、 給定兩個單鏈表(head1, head2),檢測兩個連結串列是否有交點,如果有返回第一個交點。
思路:(兩個單鏈表相交只可能為“X”型,因為單鏈表只有一個next指標)如果head1==head2,那麼顯然相交,直接返回head1。否則,分別從head1,head2開始遍歷兩個連結串列獲得其長度len1與len2。假設len1>=len2,那麼指標p1由head1開始向後 移動len1-len2步。指標p2=head2,下面p1、p2每次向後前進一步並比較p1p2是否相等,如果相等即返回該結點,否則說明兩個連結串列沒有 交點。

題三、 給定單鏈表(head),如果有環的話請返回從頭結點進入環的第一個節點
思路:運用題一,我們可以檢查連結串列中是否有環。如果有環,那麼p1p2重合點p必然在環中。從p點斷開環,方法為:p1=p, p2=p->next, p->next=NULL。此時,原單鏈表可以看作兩條單鏈表,一條從head開始,另一條從p2開始,於是運用題二的方法,我們找到它們的第一個 交點即為所求。

題四、只給定單鏈表中某個結點p(並非最後一個結點,即p->next!=NULL)指標,刪除該結點。
思路:辦法很簡單,首先是放p中資料,然後將p->next的資料copy入p中,接下來刪除p->next即可。

題五、只給定單鏈表中某個結點p(非空結點),在p前面插入一個結點。
思路:辦法與前者類似,首先分配一個結點q,將q插入在p後,接下來將p中的資料copy入q中,然後再將要插入的資料記錄在p中。

題六、給定單鏈表頭結點,刪除連結串列中倒數第k個結點
思路:使用兩個節點p1,p2,p1初始化指向頭結點,p2一直指向p1後第k個節點,兩個結點平行向後移動直到p2到達連結串列尾部(NULL),然後根據p1刪除對應結點。

題七 複雜連結串列複製
思路:複雜連結串列,其結點除了有一個m_pNext指標指向下一個結點外,還有一個m_pSibling指向連結串列中的任一結點或者NULL。第一步根據原始連結串列的每個結點N,建立對應的N’,把N’連結在N的後面;第二步是設定複製出來的連結串列上的結點的m_pSibling;第三步是把這個長連結串列拆分成兩個:把奇數位置的結點連結起來就是原始連結串列,把偶數位置的結點連結出來就是複製出來的連結串列。

題八 兩個不交叉的有序連結串列的合併
思路:主要考察了merge的過程,和連結串列的操作,在leetcode總結無止境系列之排序中有相關例題

題九 連結串列翻轉(包括全翻轉,部分翻轉,分段翻轉)(遞迴或非遞迴實現)
思路:翻轉過程一般需要三個結點指標:尾結點subTail(初始為待翻轉序列的頭結點,一步步翻轉後最後成為新序列的尾結點)、待翻轉結點pCur(其實就是尾結點的next結點)、頭結點(每次翻轉都需要更新)。具體也見下面的leetcode例題:Reverse Nodes in k-GroupReverse Linked List II

題十 實現連結串列排序的一種演算法
思路:連結串列排序可用:歸併、插入、冒泡及選擇(單向連結串列);歸併、快排、插入、冒泡及選擇(雙向連結串列);優先考慮歸併,時間複雜度低,實現簡單。

題十一 刪除有序單鏈表中重複的元素
思路:刪除重複主要有兩種思路:一是考慮複製有用結點的value值,覆蓋掉需刪除的結點;二是直接操作連結串列刪除或者藉助棧或set之類的容器來重組。

題十二 用連結串列模擬大整數加法運算
思路:要注意對進位的全面考慮

leetcode 上相關題目彙總