思路:先比較兩個鍊錶的首元結點,較小者作為合併後鍊錶的首元結點。之後遞迴比較。
注意點:1.想清楚合併的過程; 2:注意**的健壯性
**:
listnode*
merge
(listnode* phead1,listnode* phead2)
else
return mergelist;
}
問題:o(1)時間內刪除鍊錶節點
**:
void
deletenode
(listnode*
* plisthead,listnode* ptobedeleted)
//鍊錶只有乙個節點,要刪除的是尾節點(頭結點)
elseif(
*plisthead==ptobedeleted)
//鍊錶有多個節點,要刪除尾節點
else
pnode->next=
null
;delete ptobedeleted;
ptobedeleted=
null
;}
**:
//有可能刪除頭結點
void
delete
(listnode *
*phead)
else
//如果第乙個節點被刪除了
if(pprenode==
null
)else
pnode=pnext;}}
}
問題:如果乙個鍊錶中包含環,如何找出環的入口節點?
思路:第一步:如何確定乙個鍊錶中包含環?
定義兩個指標,同時從鍊錶的頭結點出發,乙個指標一次走一步,另乙個指標一次走兩步。如果走的快的指標追上了走的慢的指標,那麼就包含環;如果走的快的指標走到了鍊錶的額末尾都沒有追上另外乙個指標,那麼就不包含環。
第二步:如何找到環的入口?
p1,p2都指向鍊錶的首元節點。如果環中有n個節點,那麼p1先走n步,然後兩個指標一起走直到相遇。相遇的節點就是入口節點。
那麼環的節點數目又從何得知?
之前判斷是否存在環的時候,追上時候的節點一定是在環中。我們可以一邊計數,一邊從這個位置一直移動,直到下一次回到這個節點。
**:
//存在環的前提下,找到兩個指標的相遇位置
listnode*
meetingnode
(listnode* phead)
return
null;}
listnode*
entrynodeofloop
(listnode* phead)
//先移動pnode1 len 次數
pnode1=phead;
for(
int i=
0;i++i)
//再移動pnode1和pnode2
listnode* pnode2=phead;
while
(pnode1!=pnode2)
return pnode1;
}
思路:我們需要三個指標,分別指向遍歷到的節點和它的前乙個節點和後乙個節點
**:
listnode*
reverselist
(listnode* phead)
pnode->next=pprenode;
pprenode=pnode;
pnode=pnext;
}return preversehead;
}
思路一:
遍歷兩次鍊錶。第一次得出鍊錶節點數目n。第二次走n-k+1步得到倒數第k個節點。
思路二:
要求只遍歷一次的話。需要用到兩個指標。第乙個指標先走k-1步,然後兩個指標開始一起走,當第乙個指標走到尾節點時,第二個指標正好指向倒數第k個節點。
**:
//思路二實現
//注意**的健壯性: k的合法性
listnode*
find
(listnode *phead)
while
(pnode1->next!=
null
)return pnode2;
}
問題:輸入兩個鍊錶,找出它們的第乙個公共節點。
思路:長鍊表先走長度差步數,然後同時遍歷。
**:
node*
findfirstcommonnode
(node* l1,node* l2)
for(
int i=
0;i++i)
while
(l1!=nullptr && l2!=nullptr && l1!=l2)
node* first=l1;
return l1;
}
思路:
complexlistnode*
clone
(complexlistnode* phead)
1.複製任意節點n並建立新節點n』,再把n』鏈結到n的後邊
2.設定複製出來的節點的m_psibling
3.拆分為兩個鍊錶:奇數節點組成的就是原鍊錶,偶數部分組成的就是複製鍊錶
**:
void
clonenodes
(complexlistnode* phead)
}void
connectsiblingnodes
(complexlistnode* phead)
node=pcloned->m_pnext;}}
complexlistnode*
reconnectnodes
(complexlistnode* phead)
while
(node!=nullptr)
return pclonehead;
}
資料結構 迴圈鍊錶相關操作
include iostream include cstdlib using namespace std define true 1 define false 0 define ok 1 define error 0 typedef int elemtype typedef int status t...
資料結構 單鏈表相關習題3
解題思路 兩煉表若相交,則其最後乙個節點必定相同。所以遍歷得出兩鍊錶的尾節點可得知兩鍊錶是否相交。若兩鍊錶相交,則求出兩鍊錶長度,相減得其差值len。較長鍊錶先向後遍歷len次,隨後兩鍊錶同時向後遍歷。直到出現兩值相同時,該節點即為相交點。判定兩個鍊錶是否相交,並求出交點 linknode hasc...
資料結構學習筆記 持續更新
資料結構概述 定義 我們如何把現實中大量而複雜的問題以特定的資料型別和特定的儲存結構儲存到儲存到主儲存器 記憶體 中,以及在此基礎上為實現某個功能 比如查詢某個元素,刪除某個元素,對所有元素進行排序 而執行相應的操作,這個相應的操作也叫演算法 資料結構 個體 個體的關係 演算法 對儲存資料的操作 演...