鍊錶結構如下:
struct listnode{
int m_nvalue;
listnode * m_pnext;
1.輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。
2.求鍊錶的中間結點。如果鍊錶中結點總數為奇數,返回中間結點,如果結點總數是偶數,返回中間兩個結點的任意乙個。
3.判斷乙個單向鍊錶是否形成了環形結構。(如果是環形結構,則尾結點的下乙個結點不一定是頭結點,可能是鍊錶中的任意乙個結點)。
思路:1.
解法1:
可以先遍歷一遍鍊錶,得到鍊錶結點總數n,那麼再從頭結點開始往後走n-k+1步即可找到。
解法2:
定義兩個指標,第乙個指標從鍊錶的頭指標開始遍歷向前走k-1,第二個指標保持不動;第乙個指標從第k步開始,第二個指標也開始從鍊錶的頭指標開始遍歷。由於兩個指標的距離保持在k-1,當第乙個指標到達鍊錶的尾結點時,第二個指標正好是倒數第k個結點。
注意:如果k值為0,或者頭結點為null,需要做空值處理,還有如果k值大於鍊錶結點的個數,也需要作處理。
2.定義兩個指標,同時從鍊錶的頭結點出發,乙個指標一次走一步,另乙個指標一次走兩步。當走得快的指標走到鍊錶的末尾時,走得慢的指標正好在鍊錶的中間。
3.定義兩個指標,同時從鍊錶的頭結點出發,乙個指標一次走一步,另乙個指標一次走兩步,如果走得快的指標追上了走得慢的指標,那麼鍊錶即是環形鍊錶,如果走得快的指標走到了鍊錶的末尾都沒有追上走得慢的指標,那麼鍊錶就不是環形鍊錶。
題目4:
複雜鍊錶的複製:
鍊錶結構為:
strut complexlistnode{
intm_nvalue;
complexlistnode*m_pnext;
complexlistnode*m_psibling;
其中m_psibling用於指向鍊錶中任意乙個結點或者置為null;
分析:解法1:
借助雜湊表,將源鍊錶結點的指標和新鍊錶的結點指標一一對應存到雜湊表中,用於確定m_psibling的指向
解法2:
分三步走:
(2):假設原始鍊錶上的n的m_psibling執行結點s,那麼其對應複製出來的n』是n的m_pnext指向的結點,同樣s『也是s的m_pnext指向的結點
題目5:
輸入一棵二叉搜尋樹,將該搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
解題思路:
根節點的left指向左子樹的最大結點,right指向右子樹的最小結點
定義方法convertnode(binarytreenode* pnode,binarytreenode** plastnodeinlist)
其中pnode為當前要處理的(子)樹的根結點,plastnodeinlist為當前已經處理好的雙向鍊錶的尾結點。
convertnode表示將當前的(子)樹的根節點和已經部分存在的雙向鍊錶的尾結點處理,使得該子樹整合到雙向鍊錶中,形成新的區域性雙向鍊錶。
這樣就可以寫出遞迴**:
void convertnode(binarytreenode * pnode,binarytreenode** plastnodeinlist)
if(pnode==null)return;
binarytreenode *pcurrent=pnode;
if(pcurrent->left != null)
convertnode(pcurrent->left,plastnodeinlist);
pcurrent->left=*plastnodeinlist;
if(*plastnodeinlist != null)
(*plastnodeinlist)->right=pcurrent;
*plastnodeinlist=pcurrent;
if(pcurrent->right != null)
convertnode(pcurrent->right,plastnodeinlist);
演算法筆記 鍊錶
基本操作 建立鍊錶 尾插法和頭插法 include includeusing namespace std struct node 尾插法建立鍊錶 node create int array return head int main node l create array l l next while...
《演算法筆記》鍊錶
動態鍊錶的操作 增刪改查 鍊錶一般是帶頭結點的鍊錶,頭結點並沒有資料 遍歷鍊錶時,先令p head next,只要p非空,就可以一直迴圈 刪除鍊錶元素時,需要兩個指標,乙個指向將要刪除的元素,另乙個指向刪除元素的前驅 增加元素時,要先找到目標元素,然後新建乙個節點,在這個目標元素的後面加上新建節點 ...
演算法筆記7 3 鍊錶
create search insert del includeusing namespace std struct node 建立乙個單向鍊錶 根據陣列來初始化相應結點 node create int array,int n return head 返回頭結點 查詢元素 返回給定元素在鍊錶 現的次...