1.逆序列印單鏈表
解題思路:通過遞迴實現
viod
printlistfromtail2head(pnode phead)
}
2.刪除單鏈表的非尾結點 (不能遍歷鍊錶)void erasenottailnode(pnode pos)
3.在無頭單鏈表某節點前插入值為data新節點 (不能遍歷單鏈表)
解題思路:也可以用替換插入法,在當前節點的後面插入乙個與當前節點值相等的結點,再將當前節點的值更新為data
void
insertfront(pnode pos, datatype
data)
4.用單鏈表模擬實現約瑟夫環
約瑟夫環運作如下:
1、一群人圍在一起坐成環狀(如:n)
2、從某個編號開始報數(如:k)
3、數到某個數(如:m)的時候,此人出列,下乙個人重新報數
4、一直迴圈,直到所有人出列 ,約瑟夫環結束
作為乙個單鏈表,我們首先要做的第一步是將該單鏈表構建成乙個環,接著我們要使每乙個結點進行報數,從1開始若遇到報數為k的結點,即刪除該節點,接著從下乙個節點重新從1報數,以此類推,直至鍊錶中只剩乙個結點,結束
void josephcircle(pnode* pphead, size_t m)
ptailnode->_pnext =
*pphead;
pnode pcur =
*pphead;
while (pcur->_pnext != pcur)
//刪結點
pnode pdel = pcur->_pnext;
pdel->
data
= pcur->
data;
pcur->_pnext = pdel->_pnext;
free(pdel);
pdel =
null;
}*pphead = pcur;//最後使鍊錶的頭指向最後唯一乙個結點
}
5.單鏈表的逆置
方法一:三指標法
解題思路:解決這個問題,我們可以通過三個指標來實現pre ,cur, next
先讓pre指向空,cur指向單鏈表的頭,next指向頭的下乙個節點,
第一步:使cur的next域指向pre
第二步:pre走到cur的位置
第三步:cur接著走到next的位置
第四步:next走到cur的next域處
令這幾步一直迴圈,直到next走到null時停止,即完成了單鏈表的逆序
void reverselist(pnode* phead)
*phead = ppre;//最後使單鏈表的頭指向原單鏈表的最後乙個結點
}
方法二:頭插法
與上述方法類似,給出**
pnode reverselist_p(pnode phead)
return pnewnode;
}
6.使用氣泡排序對單鏈表進行排序
void bubblesort(pnode phead)
pcur = pnext;
pnext = pnext->_pnext;
}ptail=pcur;//每一輪排序結束更新尾結點的位置
if (0
== flag)
return;
}}
7.查詢單鏈表的中間結點,要求只能遍歷一次鍊錶
1—>2—>3—>4—>null 偶數個結點,要求返回中間兩節點中的前乙個節點
1—>2—>3—>4—>5—>null 奇數個結點,返回中間結點
pnode findmiddlenode(pnode phead)
if (null
== pfast)//偶
return ppre;
else
//奇return pslow;
}
8.查詢鍊錶的倒數第k個結點
解題思路:也是給兩個快慢指標,快指標先走k步,然後快慢指標同時走,由於快慢指標之間總是相差k個結點 , 所以當快指標走到空時,慢指標指向的結點即為倒數第k個結點
pnode findlastknode(pnode phead, size_t k)
//pfast和pslow同時走
while (pfast)//或while(pfast->_pnext)
return pslow;
}
10.刪除單鏈表的倒數第k個結點
解題思路:運用上述方法先找到倒數第k個結點,同時標記慢指標的前一結點
,找到後刪除該節點即可,注意傳參時應傳二級指標,因為待刪結點有可能是頭節點,會改變頭節點的指向
int deletelastknode(pnode* pphead, size_t k)
while (pfast)
pslowpre->_pnext = pslow->_pnext;
free(pslow);
pslow =
null;
return
1;}
11.合併兩個已序鍊錶,合併之後依然有序
解題思路:運用二路歸併的思想
若兩煉表有乙個為空,直接返回另乙個鍊錶。兩煉表都不為空時,先比較兩煉表頭節點的數值大小來確定新鍊錶的頭,將新鍊錶的尾也放在頭部,再比較兩鍊錶其餘節點的值的大小,依次鏈結在新鍊錶的後面,當有乙個鍊錶走到空時,將非空的另一煉錶鏈在新鍊錶後面即可
pnode mergelist(pnode phead1, pnode phead2)
else
while (pl1&&pl2)
else
ptail = ptail->_pnext;
}//若l2已經全都鏈結在新鍊錶上,直接將l1接在新鍊錶的尾結點上
if (pl1)
ptail->_pnext = pl2;
//若l1已經全都鏈結在新鍊錶上,直接將l2接在新鍊錶的尾結點上
if (pl2)
ptail->_pnext = pl1;
return pnewhead;
}
關於單鏈表的常見面試題(筆記三)
1.求單鏈表中有效節點個數 思路 如果有頭節點則去掉頭結點 1.定義輔助遍歷變數cur,令cur head.next。2.定義length記錄資料。求單鏈表中有效節點個數 如果有頭結點則去掉頭結點 public static intgetlength heronode head 定義輔助變數 her...
單鏈表的面試題
自定義標頭檔案部分 void deletenottail pnode pos 刪除乙個無頭單鏈表的非尾節點 void insertnothead pnode phead,pnode pos,datatype data 在無頭單鏈表的乙個非頭節點前插入乙個節點 void josephcircle pn...
面試題 單鏈表反轉
問題 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。一 非遞迴演算法 假設有鍊錶a b c d e f g。在反轉鍊錶過程中的某一階段,其鍊錶指標指向為 a b c d e f g。也就是說在結點d之前的所有結點都已經反轉,而結點d後面的結點e開始的所有結點都沒有反轉。這樣...