單鏈表常見筆試面試題總結

2021-08-03 21:59:11 字數 3063 閱讀 7176

1.單鏈表逆置

#include

using namespace std;

typedef int keytype;

typedef struct node

node, *

list;

void reserver(list plist)

//鍊錶至少有兩個節點

node *p = plist->next;

node *q = p->next;

node *s;

plist->next =

null;//頭節點要指向尾節點,先將其指標域賦為null

while(q !=

null)

plist->next = p;

return;

}

2.逆序列印單鏈表

//1.如果要破壞單鏈表的結構,則像1題一樣,使用斷鏈-接鏈,然後遍歷單鏈表

//2.如果不能破壞單鏈表的結構,可以使用stack,遍歷後壓棧,最後統一出棧

#include

#include

using

namespace

std;

void printreserve(list plist)

while(!st.empty())

3.給定單鏈表,檢測是否有環

思想:使用快慢指標,快指標每次走兩格,慢指標每次走一格。如果有環,快慢指標總會相遇。如果快慢指標相遇,說明有環。如果快指標為null,則說明無環。

bool i***itloop(list plist)

node *fast = plist;

node *slow = plist;

while(fast!=

null

|| slow!=

null)

}//退出迴圈,slow==false,有環 或者fast==null,沒有環

return fast==

null

?false : true;

}

4.求環的長度

思想:從相遇節點開始,下次再走到該相遇點時經過的節點數為環的長度。

int looplength(list plist)

}if(fast ==

null)//沒有環

node *tmp = slow;

slow = slow->next;

int count =

1; while(slow != tmp)

count +=

1; return count;

}

5.給定單鏈表(head),如果有環的話返回從頭結點進入環的第乙個節點

思想:有定理證明,碰撞點到尾節點的距離=頭節點到入口點的距離。慢指標從頭節點開始走,快從相遇點開始走。當快指標為null時,慢指標所指的節點為環的第乙個節點。

node *findentrynode(list plist)

}if(fast ==null)

slow = plist;

while(fast != slow)

return slow==fast ? slow : null;

}

6.給定兩個單鏈表(plist1, plist2),檢測兩個鍊錶是否有交點,如果有返回第乙個交點

思想:如果plist1==plist2,鍊錶相交點就是plist1。否則,先求出鍊錶的長度,讓快指標先走len1-len2步,然後快慢指標開始走,每次走一步。當快指標走到尾節點時,慢指標指向的節點為鍊錶的相交點。

node *findnode(list plist1, list plist2)

if(plist1 == plist2)//指標指向同乙個鍊錶

node *p = plist1;

node *q = plist2;

int len1 =

0; int len2 =

0; for(; p!=

null; p=p->next)

++len1;

for(; q!=

null; q=q->next)

++len2;

int num = len1>len2 ? len1-len2 : len2-len1;

int i =

0; p = plist1;

while(inext!=

null)

q = plist2->next;

while(p != q)

return q;

}

7.只給定單鏈表中某個結點p(並非最後乙個結點,即p->next!=null)指標,刪除該結點

思想:用後值覆蓋前值,刪除最後乙個節點。切記:將倒數第二個節點的next域置為null。

bool deletenode(node *p)

p = p->next;

}tmp->next =

null;

delete p;

return

true;

}

8.給定單鏈表頭結點,刪除鍊錶中倒數第k個結點

bool deleteknode(list plist, int num)

node *back = plist;

node *tmp = plist;

while(front !=

null)

//back所指向的節點為倒數第k個節點

deletenode(back);

return

true;

}

9.只給定單鏈表中某個結點p(非空結點),在p前面插入乙個結點val

思想:在p後面新增乙個節點s,s->value=p->value; p->value=val

bool insertnode(node *p, keytype val)

單鏈表常見面試題

ifndef linklist h define linklist h define crt secure no warnings include include include string h include typedef int datatype typedef struct node no...

常見單鏈表面試題

面試中經常被問到有關鍊錶的問題,現總結如下 此處的鍊錶結構為不帶頭結點的單鏈表 單鏈表結構 struct listnode 1 尾插法建立單鏈表 listnode buildlisttail int n else return head 輸入1 2 3 4,輸出1 2 3 42 頭插法建立單鏈表 l...

單鏈表常見面試題

一 獲取單鏈表的節點個數 思路 遍歷鍊錶 head 煉表頭結點 param head return 方法 獲取到單鏈表結點的個數 如果是帶頭結點的鍊錶,不統計頭結點 public static int getlength heronode head int length 0 定義乙個輔助變數,沒有統...