目錄
從尾到頭列印鍊錶(劍指歐肥兒)
刪除鍊錶中重複的節點(劍指歐肥兒)
鍊錶中環的入口結點(劍指歐肥兒)
兩個鍊錶的第乙個公共結點(劍指歐肥兒)
合併兩個排序的鍊錶(劍指歐肥兒)
反轉鍊錶(劍指歐肥兒)
題目描述:輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個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前,要先判斷節點是否已經存在容器中,已判斷鍊錶是否是迴圈鍊錶。同理,在...