演算法筆記 鍊錶

2021-06-15 00:13:47 字數 1960 閱讀 9595

鍊錶結構如下:

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 返回頭結點 查詢元素 返回給定元素在鍊錶 現的次...