鍊錶操作(04)

2021-09-26 14:04:49 字數 4488 閱讀 9436

【輸入乙個鍊錶,按鍊錶從尾到頭的順序返回乙個arraylist 】

方法一:使用棧來作為中間儲存結構

/**

* struct listnode

* };

*/class solution

while(!v.empty())

return arraylist;}};

方法二:遞迴呼叫

/**

* struct listnode

* };

*/class solution

return arraylist;}};

【輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點】方法一:暴力解決,兩個迴圈。第乙個迴圈算出鍊錶的長度,第二個迴圈來計算倒數第k個結點

/*

struct listnode

};*/

class solution

for(listnode* p=plisthead;p!=null;p=p->next)}}

};

方法二:雙指標,第乙個指標指向鍊錶的開頭,第二個指標相對於第乙個指標向右偏移 k+1 個結點。然後兩個指標同步移動,當第二個指標指向鍊錶的結尾時,第乙個指標剛好指向倒數第 k 個結點。

/*

struct listnode

};*/

class solution

int n=0;

listnode *p1=plisthead;

listnode *p2=plisthead;

// p2指標先走k-1步,指向第k個結點

while(p2!=null && nnext;

}// 當鍊表的個數小於間距k時,返回空

if(p2==null && nnext;

p2=p2->next;

}return p1;}};

【輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭】分析:使用三個指標,分別指向當前的結點、前結點、後結點。然後來進行反轉

/*

struct listnode

};*/

class solution

return pprev;}};

【輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則】分析:通過逐個比較兩個鍊錶中的元素,按照遞增的順序來建立乙個新的鍊錶。

方法一:通過遞迴來進行比較。通過遞迴來實現會更加簡潔。

/*

struct listnode

};*/

class solution else

return phead;}};

方法二:通過迴圈進行比較

/*

struct listnode

};*/

class solution

if(phead2==null)

// 首先確定好頭指標

listnode *phead=null;

listnode *p1=phead1, *p2=phead2;

if(p1->val < p2->val)else

// 然後再遍歷待合併的兩個鍊錶

listnode *cur=phead;

while(p1!=null && p2!=null)else

}// 將剩下的待合併鍊錶部分,並到合併鍊錶中

if(p1!=null)

if(p2!=null)

return phead;}};

【給定單向鍊錶的頭指標和乙個節點的指標,定義乙個函式在o(1) 時間內刪除該節點】

1、分析:

如果已知該節點不在末尾,則可以將該節點的下乙個節點拷貝該節點上,覆蓋該節點原來的內容,然後再將該節點指向下下個節點,將該節點的下乙個節點刪除。

2、**如下:

struct listnode

;void deletenode(listnode** plisthead, listnode* ptobedeleted)

// 鍊錶只有乙個節點,即是頭節點也是尾結點

else if (*plisthead == ptobedeleted)

// 鍊錶中有多個節點時,刪除尾結點

else

ptemp->pnext = nullptr;

delete ptobedeleted;

ptobedeleted = nullptr;}}

【在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5】

1、分析:可以首先建立乙個節點作為鍊錶的頭節點,這樣就可以不用再考慮頭節點的問題

2、方法一:通過返回鍊錶的頭指標,**如下

/*

struct listnode

};*/

class solution

pprenode->next=pnode;

}else

}return first->next;}};

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null

1、分析:將該問題分解成三個小的問題來進行解決

2、**如下:

/*

struct listnode

};*/

class solution

//求入口節點

listnode* pahead=phead;

listnode* pbehind=phead;

for(unsigned int i=0;inext;

}while(pahead!=pbehind)

return pahead;

}//查詢鍊錶的入口節點

listnode* meetnode(listnode* phead)

return nullptr;}};

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head

1、分析:

(1)、可以將每個節點先進行複製,並組合成乙個長的鍊錶。此時只考慮每個節點的下乙個節點,不考慮隨機節點。如下圖

(2)、再複製隨機鏈結節點

(3)、再將該長鍊錶進行拆分,奇數字置上的節點連線起來即為要求的新鍊錶。

2、**

/*

struct randomlistnode

};*/

class solution

// 只新增每個節點的複製節點

void clonenext(randomlistnode* phead)

}// 複製每個節點的隨機鏈結節點

void clonerandom(randomlistnode* phead)

else

p=p->next->next;}}

// 將長鍊錶進行拆分出滿足需要的新鍊錶。

randomlistnode* createclonelist(randomlistnode *phead)

while(pnode!=nullptr)

return pnewhead;}};

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向

1、分析:

使用中序遍歷來進行排序

2、**

/*

struct treenode

};*/

class solution

void convertnode(treenode *pnode,treenode** plastnode)

pcur->left=*plastnode;

if(*plastnode!=nullptr)

(*plastnode)->right=pcur;

*plastnode=pcur;

if(pcur->right!=nullptr)}};

鍊錶 04 迴圈鍊錶

迴圈鍊錶 template class circlelist template class circlelistiterator 節點類circlelistnode template class circlelistnode 預設的建構函式 迴圈鍊錶類circlelist template clas...

鍊錶問題04 反轉單向和雙向鍊錶

題目 分別實現反轉單向鍊錶和反轉雙向鍊錶的函式。要求 如果鍊錶長度為n,時間複雜度要求為o n 額外空間複雜度要求為o 1 解答 反轉單向鍊錶,參考部落格 實現1 單向鍊錶 struct node static node reverselist node head return pre 實現2 雙向...

刷題04 奇偶鍊錶

leetcode 328.奇偶鍊錶 給定乙個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 o 1 時間複雜度應為 o nodes nodes 為節點總數。說明 思路...