程式設計題 關於鍊錶

2021-09-10 17:15:39 字數 3710 閱讀 9248

目錄

從尾到頭列印鍊錶(劍指歐肥兒)

刪除鍊錶中重複的節點(劍指歐肥兒)

鍊錶中環的入口結點(劍指歐肥兒)

兩個鍊錶的第乙個公共結點(劍指歐肥兒)

合併兩個排序的鍊錶(劍指歐肥兒)

反轉鍊錶(劍指歐肥兒)

題目描述:輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個arraylist。

解題**:

class solution        

while(!help.empty())

return result}}

**思路:引入輔助棧

**時間複雜度為o(n)

棧的長度大小,為len = help.size()

題目描述:在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5

解題**:

class solution 

return deleteduplication(current);

}else}};

**思路:運用遞迴(這個遞迴燒腦啊)

每個if,else都要return,否則會報錯

while(current != null && current->val == phead->val)不能寫成whiel(current != null && current->val == current->next->val) 會堆疊溢位

遞迴出當前節點的下乙個節點直至到null節點

題外話:陣列在作為函式引數時就會退化為指標。

題目描述:給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

解題**:

/*

struct listnode

};*/

class solution else

}//計算出環中的節點個數n

tempnode = pfast->next;

while(tempnode != pfast)

//快指標比滿指標多n步,每次一起走一步

p1 = phead;

p2 = phead;

for(int i=0;inext;

}while(p1 != p2)

return p1;}};

**思路(這道題思路非常重要):排除特殊情況

利用兩個快慢指標找出乙個在環中的節點

步驟2得到的環中節點,來得出環的個數n再利用兩個快慢指標,設定兩個指標步長差距為n,每次同時走一步,當兩個指標相遇時,指標對應的節點就是環的起點。

題目描述:輸入兩個鍊錶,找出它們的第乙個公共結點。

解題**一:

/*

struct listnode

};*/

class solution

while(p2)

if(len1>len2)else

for(int i = 0; i < diff; i++)

while((p1!=null) && (p2!=null))

return p1;}};

解題思路:首先關鍵在於,如果兩個鍊錶相交,那麼他們相交以後的鍊錶,就是同乙個鍊錶了。

所以,我們先把兩個鍊錶的長度算出來,分別為len1,len2。

判斷len1和len2誰長,並計算出len1-len2的差值diff

然後p1指向長的鍊錶,並前進diff個節點,這樣p1剩餘的節點數就和p2一樣了。

然後p1和p2共同往前走,每走一步比較他們是否是相等。不相等則繼續比較。直到p1返回null或相同的節點為止。

解題**二:

/*

struct listnode

};*/

class solution

return p1;}};

解題思路:這個方法很nb是真的很nb,不需要過多的計算兩個鍊錶的長度,長度之差,直接讓指標一直往下走就ok了,但是這個方法很難想到。

指向長鍊表的指標走到空值的時候,指標指向了另乙個短鍊表的頭部,此時兩個指標是距離鍊錶的尾部是相等距離的。

記下這個方法,很經典!

題目描述:輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。

解題**:

/*

struct listnode

};*/

class solution

if(!phead2)

listnode* p;

listnode* phead;

if(phead1->val <= phead2->val)else

p = phead; //給p初始化。p會接在phead後面把

while(phead1 && phead2)else

}if(phead1)

if(phead2)

return phead;}};

解題思路:最關鍵的一點,判斷輸入兩個鍊錶是否為null,如果不判斷,測試用例是絕對過不了的。

本題採用外排法,對兩個鍊錶進行遍歷比較。

p = phead;將phead的節點賦值給p節點,然後p節點幫助phead連線後面的節點。最後,有乙個鍊錶還有多餘的尾巴,即把多餘的尾巴加在p後面。

題目描述:輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。

解題**:

/*

struct listnode

};*/

class solution

listnode* head;

while(!s.empty())else

}phead -> next = null; //這一句不加的話,測試用例100%過不了。

return head;

}private:

stacks;

};

解題思路:用棧將節點儲存,然後輸出,即是逆序節點。

逆序輸出後,最後乙個節點一定要顯示賦值為null——phead -> next = null

程式設計題 分隔鍊錶

題目介紹 給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2 x 3 輸出 1 2 2 4 3 5 思路 將整個鍊錶分為兩個鍊錶,一部分是小於x的,一部分是大...

java鍊錶高階程式設計題

通過編碼實現單鏈表稍微複雜點的操作功能 1 查詢鍊錶倒數最後的n節點 public node findnodelasttopn node head,int n node previous head node current head for int i 0 i1 i current current....

程式設計題 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。使用hash map容器按順序儲存每個節點,並生成乙個新的節點,不過在加入hash map前,要先判斷節點是否已經存在容器中,已判斷鍊錶是否是迴圈鍊錶。同理,在...