鍊錶筆試面試題

2021-06-18 13:48:33 字數 3634 閱讀 9451

有些許錯誤,第乙個程式

1.已知鍊錶的頭結點head,寫乙個函式把這個鍊錶逆序

[cpp]view plain

copy

void

list::reverse()  

head->next  = null;  

head = p;  

}  

遞迴方法:

[cpp]view plain

copy

void

list::reverse2(list_node * curnode)  

reverse2(curnode->next);  

curnode->next->next=curnode;  

if(curnode == head)  

}  2.已知兩個鍊錶head1 和head2 各自有序,請把它們合併成乙個鍊錶依然有序。

[cpp]view plain

copy

void

list::merge(list & list)  

tempa->next=b;  

}  else

tempb->next=a;  

}  }  

}  

遞迴方法:

[cpp]view plain

copy

list_node* list::recursive_merge(list_node * a,list_node * b)  

if(a->value > b->value)  

}  3.有乙個鍊錶l,其每個節點有2個指標,乙個指標next指向鍊錶的下個節點,另乙個random隨機指向鍊錶中的任乙個節點,可能是自己或者為空,寫乙個程式,要求複製這個鍊錶的結構並分析其複雜性

這個題目的方法很巧妙,將兩個鍊錶連線起來形成乙個鍊錶,設定好random指標後再將兩個鍊錶分割開來。

[cpp]view plain

copy

list list::copyrndlist()  

else

cur=cur->next->next;  

}  cur = head;  

while

(cur)  

cur = head;  

list_node * dst = cur->next;  

while

(cur)  

list newlist;  

newlist.head = newhead;  

return

newlist;  

}  

4. 找出單向鍊錶中中間結點

兩個指標,乙個步長為1,另乙個步長為2.步長為2的走到底後步長為1的正好到中間。

[cpp]view plain

copy

list_node * list::middleelement()  

}  5. 如何檢查乙個單向鍊錶上是否有環

同樣兩個指標,乙個步長為1,另乙個步長為2,如果兩個指標能相遇則有環。

[cpp]view plain

copy

list_node * list::getjoinpointer()  

if(one == null || two == null)

return

null;  

return

one;  

}  

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

設煉表頭到環入口節點距離為x,環入口節點到兩個指標相遇節點距離為z,換長度為y,則有x+z+1=y,所以z=y-1-x,即乙個指標從鍊錶頭部開始移動,乙個指標兩個指標相遇後乙個節點開始移動,相遇的地方即為環入口

[cpp]view plain

copy

list_node * list::findcycleentry()  

return

p;  

}  

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

將p後面那個節點的值複製到p,刪除p後面的節點

[cpp]view plain

copy

void

list::deletebypointer(list_node * node)  

}  }  

8.在p前面插入乙個節點

在p後面插入新節點,將p的值與新建的節點值互換。

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

乙個指標指向煉表頭,另乙個指標指向第k個指標,然後兩個指標一起移動,第二個指標到了末端則第乙個指標就是倒數第k個節點

[cpp]view plain

copy

list_node * list::lastkelement(

intk)  

if(p == null && t >0)

return

null;  

list_node * q=head;  

while

(q && p)  

return

q;  

}  

10. 判斷兩個鍊錶是否相交。

兩種情況,如果鍊錶有環,則先在環裡設定乙個指標不動,另乙個鍊錶從頭開始移動,如果另乙個鍊錶能夠與環中的指標相遇則是相交。

如果沒有環,則判斷兩個鍊錶的最後個節點是否相同,相同則相交

[cpp]view plain

copy

bool

list::isintersecting(

const

list & list)  

q=q->next;  

}  flag = true

;  }  

else

return

flag;  

}  

11. 兩個鍊錶相交,找出交點

求出兩個鍊錶的長度a和b,乙個指標指向較短鍊錶的頭head,另乙個指標指向較長鍊錶的第head+|a-b|,然後兩個指標一起移動,相遇處即為交點。

[cpp]view plain

copy

list_node * list::intersectnode(

const

list & list)  

a = abs(cnt - list.cnt);  

while

(p && a)  

while

(p&&q)  

if(p && q && p == q)

return

p;  

return

null;  

}  

煉錶筆試題

反轉鍊錶 節點 class node object def init self,elem self.elem elem self.next none 鍊錶 class singlelist object def init self,head self.head head 反轉鍊錶 defrevers...

面經 煉錶筆試題

鍊錶的基本題型主要就以下這幾種,其他的基本是在這基礎上引申出來,所以如果基本掌握這幾種單向鍊錶的題,鍊錶基本沒什麼太大問題了。1.刪除無頭非尾節點 2.鍊錶的氣泡排序 3.反轉鍊錶 4.在當前節點前插入乙個資料x 5.查詢鍊錶的中間節點。6.刪除單鏈表的倒數第k個節點 k 1 k 總長度 對於上面這...

常考煉錶筆試題(一)

1 刪除鍊錶中等於給定值 val 的所有節點。示例 輸入 1 2 6 3 4 5 6,val 6 輸出 1 2 3 4 5 思路 要刪除鍊錶中等於給定值的所有節點,我們可以定義乙個結果鍊錶,再結合尾插的方法來實現。定義乙個last引用,指向結果鍊錶的最後乙個節點,cur引用指向給定鍊錶的第乙個節點。...