從尾到頭列印單鏈表
刪除乙個無頭單鏈表的非尾節點
在無頭單鏈表的乙個節點前插入乙個節點
單鏈表實現約瑟夫環
逆置/反轉單鏈表
單鏈表排序(氣泡排序&快速排序)
合併兩個有序鍊錶,合併後依然有序
查詢單鏈表的中間節點,要求只能遍歷一次鍊錶
查詢單鏈表的倒數第n個節點,要求只能遍歷一次鍊錶
遞迴法,若當前節點不為空,在列印當前節點前列印上乙個節點。
void converseprint(listnode* plist)
}
將當前節點的內容改為下個節點的內容,釋放下個節點,讓當前節點指向下下個節點。
void popnode(listnode* plist)
}
新建乙個節點儲存當前節點的內容,並指向下乙個節點。
將當前節點改為插入的內容,指向新節點。
void
insertbefore(listnode* plist, datatype x)
void joseph(listnode** pplist, int n)
*pplist = plist;
}
void reverselist(listnode** pplist)
*pplist = newlist;
}
void listbubblesort(listnode* plist)
cur = next;
next = next->next;
}if (exchange ==
0) return;
tail = cur;}}
方法一
- 新煉表段接法
- 接收兩個鍊錶指標,處理有空鍊錶的情況。
- 建立新煉表頭指標,指向兩煉表頭節內值點較小的的節點。
- 迴圈,節點小的指標後移,直到節點下一節點大於另一指標或節點為空,tmp 儲存下一節點,當前節點指向另一指標,當前指標賦值為 tmp,如果當前指標為 null,說明合併完成,結束迴圈。
- 返回新煉表頭指標。
- 可以總是讓 p1 指向小的,p2 指向大的,迴圈挪 p1,接完後再把小的給 p1,大的給 p2。可以不用比較。(原方法 else 是複製 if 後,1 和 2 換,其實更簡單,看起來多)
思路圖
listnode* mergelist(listnode* list1, listnode* list2)
listnode* tmp = list1->next;
list1->next = list2;
list1 = tmp;
if (list1 ==
null)
break;
}else
listnode* tmp = list2->next;
list2->next = list1;
list2 = tmp;
if (list2 ==
null)
break;}}
return newlist;
}
方法二
- 新鏈單節點表尾插法
- 新建 newlist = null, 迴圈,每次比較兩指標內容,儲存小的節點,小節點指標後移,小節點尾接到 newlist。
- 如果有乙個指標為 null,另乙個指標尾接到 newlist,返回 newlist。
方法三- 介於上兩個方法之間,以頭結點小的為 newlist,另乙個鍊錶每次拿下乙個節點接到 newlist 的合適位置,直到其中乙個指標為空。
listnode* findmidnode(listnode* plist)//mid = total>>1
return plist;
}
listnode* findfromlast(listnode* plist, int n)
while (plist->next != null)
return ret;
}
單鏈表 (面試題)
關於單鏈表的基本操作,之前已經總結過了,那些掌握之後算是了解了單鏈表是什麼?不過現在面試的題中,肯定不會只讓你回答單鏈表的基礎操作,總是會改變一些東西,或是擴充套件一下。下面就是一些關於單鏈表的擴充套件內容 include include include pragma warning disable...
單鏈表面試題
1.倒序列印鍊錶 void reverseprint slistnode pfirst 有兩種方法 1.遞迴操作 2.非遞迴操作 2 非遞迴 slistnode pend slistnode pcur pend null while pfirst pend pend pcur printf d pe...
單鏈表(面試題)
鍊錶反轉思路 1.單鏈表中有效節點的個數 2.查詢單鏈表中弟第k個節點 3.單鏈表的反轉 實現 如下 public class testlink 1單鏈表中有效節點的個數 遍歷得出個數 public static intcount heronode head int count 0 while tr...