【輸入乙個鍊錶,按鍊錶從尾到頭的順序返回乙個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 為節點總數。說明 思路...