劍指offer 堆 棧,佇列 鍊錶題目總結

2021-07-30 19:48:15 字數 3615 閱讀 7707

劍指offer 

1.鍊錶,新增鍊錶

struct listnode

void addtotail(listnode**phead, int value)

刪除鍊錶

void removenode(listnode**phead,int value)

else

}if(pdelete!=null)

2. 從頭到尾列印鍊錶

**

* struct listnode

* };

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

class solution

vectorans;

while(!s.empty())

return ans;

}};

3.在o(1)的時間內刪除鍊錶

/*

struct listnode

};*/

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

例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5

因為相同的結點全部都要刪除,設定三個指標,乙個指向當前結點,乙個指向前一結點,乙個指向下一結點,一旦遇到當前結點等於下一結點的情況,

那麼就一直移動,直到遇到下乙個結點不同的狀況,再將前乙個結點指向此時結點的位置。

*/class solution

else

if(pprenode==null)

phead = pnextnode;

else

pprenode->next = pnextnode;

pnode = pnextnode;

} }

return phead;

}};

4.鍊錶的倒數第k個節點

乙個指標先往前走k-1步,然後另外乙個指標才開始走,當第乙個指標走到尾部了,那麼第二個指標正好指向了倒數第k個結點

/*

struct listnode

};*/

class solution

listnode *second = plisthead;

while(first->next)

return second;

}};

5.反轉鍊錶

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。

儲存新的前一結點,當前結點和下一結點三個指標,只要下一結點為空,那麼我們就到了原本結點的尾部,這時正是新鍊錶的頭部

/*

struct listnode

};*/

class solution

return pnewlist;

}};

6.合併兩個排序的鍊錶

/*

struct listnode

};*/

class solution

else

cur->next = nullptr;

} if(ptr1)

cur->next = ptr1;

if(ptr2)

cur->next = ptr2;

return newlist->next;

}};

7.兩個鍊錶的第乙個公共節點

/*

struct listnode

};*/

class solution

return length;

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

listnode* pfirst=plistnodelong;

return pfirst;

}};

8.二叉搜尋樹與雙向鍊錶

9.複雜鍊錶的複製

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

11.兩個棧實現乙個佇列

template class cqueue

;templatet cqueue::deletehead()

}tmp = stack2.top();

stack2.pop();

return tmp;

}

12.包含min函式的棧

13.棧的壓入和彈出序列

/*

輸入兩個整數序列,第乙個序列表示棧的壓入順序,

請判斷第二個序列是否為該棧的彈出順序。假設壓入

棧的所有數字均不相等。例如序列1,2,3,4,5是某棧

的壓入順序,序列4,5,3,2,1是該壓棧序列對應的

乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列

的彈出序列。

演算法描述:

首先判斷兩個序列的元素數目是否相等,

不相等,則肯定不是;

遍歷pop,每遍歷乙個數,先將push陣列裡的壓入棧,以i為push陣列游標,

直到棧頂值與當前pop值相等,

,然後彈出棧頂值,如果

直到i大於push陣列的大小還沒碰到棧頂值與pop陣列相等

的值,則返回false

*/class solution

s.pop();

}return true;

}};

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。

/*

struct listnode

};*/

class solution

while(pslow!=pfast);

pslow = phead;

while(pslow!=pfast)

return pslow;

}};

2. 劍指offer 尋找鍊錶中的倒數第k個節點,和程式設計之美中判斷兩個鍊錶是否相交類似,都是從鍊錶尾部開始的。

程式設計之美的兩道題目 

1.從無頭單鏈表中刪除節點

由於單鏈表沒有頭指標,,不能簡單的刪除,會使得鍊錶被分割

void deleterandomnode(node* pcurrent)

* };*///輸入乙個鍊錶,從尾到頭列印鍊錶每個節點的值。class solution vectorans; while(!s.empty()) return ans; }};

《劍指offer 之鍊錶題目

這幾天在看 劍指offer 寫的很好,跟july的各有千秋,更加注重歸納總結,筆試面試臨時抱佛腳,決定要啃下這其中的46道題目。ok,把每道題目自己實現,相同的歸成一類。這次把所有的與list相關的題目列出來。思路 從尾到頭列印list的話,考慮用stack先把各節點儲存起來,遍歷完以後再將stac...

劍指offer 鍊錶題目集合

從尾到頭列印鍊錶 class solution 返回從尾部到頭部的列表值序列,例如 1,2,3 def printlistfromtailtohead self,listnode rs if not listnode return rs while listnode listnode listnod...

劍指Offer題目1518 反轉鍊錶

題目1518 反轉鍊錶 時間限制 1 秒 記憶體限制 128 兆 特殊判題 否 提交 3300 解決 1207 題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。hint 請務必使用鍊錶 輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 10...