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 定義乙個輔助變數,沒有統...