劍指offer 鍊錶

2021-08-19 00:23:33 字數 1852 閱讀 3215

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。

思路1:遞迴版

class solution //找到當前節點與下乙個節點不重複的點,從不重複的點開始遞迴

return deleteduplication(phead->next);

}else

}};

思路2 非遞迴版

class solution 

//如果p指向鍊錶中第乙個元素,p -> ... -> q ->... , 要刪除p到q, 將指向鍊錶第乙個元素的指標phead指向q->next。

if( p == phead )

else//如果p不指向鍊錶中第乙個元素,pre -> p ->...->q ->... ,要刪除p到q,即pre->next = q->next

//當前處理的p要向鍊錶尾部移動

p = q->next;

}else

}return phead;

}};

class solution 

//第二個指標也從鍊錶的頭指標開始,

//第乙個指標到達尾節點時,第二個到達倒數第k個

while(phead->next!=

null)

return ptail;

}};

輸入乙個鍊錶,從尾到頭列印鍊錶每個節點的值。

思路1:

把節點的值從頭節點開始放到vector裡

反轉vector。

/**

* struct listnode

* };

*/class solution

reverse(v.begin(),v.end());

return v;

}};

思路2

把鍊錶反轉,在從反轉後的鍊錶的頭結點遍歷

class solution 

//這時的pre 是反轉鍊錶的頭節點

while(pre!=nullptr)

return v;

}};

思路:遞迴版

class solution 

else

}};

思路2:非遞迴版

class solution 

else

listnode *p = mergehead; //頭指標先留著要返回,p是工作指標

while(phead1&&phead2) //有乙個鍊錶到結尾時,結束

else

}if(phead1==nullptr)p->next = phead2;//鍊錶1遍歷完了

if(phead2==nullptr)p->next = phead1;

return mergehead;

}};

面試題52: 兩個鍊錶的第乙個公共節點

計算兩連表的長度差

如果鍊錶1的長度大於鍊錶2的長度

先遍歷鍊錶1,遍歷的長度就是兩鍊錶的長度差

如果鍊錶2的長度大於鍊錶1的長度

先遍歷鍊錶2,遍歷的長度就是兩鍊錶的長度差

開始齊頭並進,直到找到第乙個公共結點

listnode* findfirstcommonnode( listnode* phead1, listnode* phead2) 

else

while(cur1!=cur2)

return cur1;

}

劍指offer 鍊錶

單向鍊錶的結構定義 typedef int datatype struct listnode 問題1 往鍊錶的末尾新增乙個結點 給定頭結點,往末尾插入乙個結點 void insertnode listnode head,datatype key listnode p head while p nex...

劍指offer 鍊錶

鍊錶 鍊錶是一種動態資料結構 struct listnode 往鍊錶的末尾新增乙個節點的c 程式如下 void addtotail listnode phead,int value 注意第乙個引數phead是乙個指向指標的指標。當我們往乙個空鍊錶插入乙個結點時,else pnode m pnext ...

鍊錶 劍指offer

從尾到頭列印鍊錶 思路 先把鍊錶翻轉,然後將翻轉後的鍊錶列印出來 這種方法 因為多分配鍊錶節點指標,故可能會對記憶體的消耗要大一點 時間複雜度為o n vector printlistfromtailtohead listnode head head p2 鍊錶翻轉後,頭結點為p2 while he...