鍊錶常見筆試題

2021-08-30 17:13:11 字數 2297 閱讀 9899

鍊錶的一些常見筆試面試問題總結及**

先什麼也不說,假設鍊錶節點的資料結構為:

struct node ;

建立單鏈表的程式為:

struct node* create(unsigned int n)

node* p = head;

for (unsigned int i = 1; i < n; i++)

return head;

}問題1:鍊錶逆置

思想為:head指標不斷後移,指標反向即可,**為:

void reverse(node*& head)

head->next = p;

}return;}

問題2:刪除不知頭結點鍊錶的某個節點

如果單向鍊錶不知道頭節點,乙個指標指向其中的乙個節點,問如何刪除這個指標指向的節點?

問題3:怎麼判斷鍊錶中是否有環?

思想為:設定兩個指標,乙個步長為1,另乙個步長為2,依次後移,如果相遇且都不為空,則有環。

與這個類似的問題包括:怎麼快速檢測出乙個巨大的鍊錶中的死鏈?或者如何找出乙個單鏈表的中間節點?

**為:

bool loop(node* head)

node* one = head;

node* two = head->next;

if (two == null)

while (one != two)

if (two != null)

if (two == null)

two = two->next;

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

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

return flag;}

問題4:如果乙個單向鍊錶,其中有環,怎麼找出這個鍊錶迴圈部分的第乙個節點?

思想為:假設該節點在x位置處,假設步長為1的指標和步長為2的指標相遇在x+z處,迴圈的長度為y,那麼2(x+z)-(x+z)=k*y,

那麼當乙個指標再從開始出後移時,另乙個指標從相遇點開始後移時,這兩個指標就會在迴圈開始處相遇。

**為:

node* findloopplace(node* head, unsigned int* place = null)

node* one = head;

node* two = head->next;

unsigned int count = 1;

while (one != two)

one = head;

while (one != two)

two = two->next;

count++;

}*place = count;

return one;}

問題5:如何查詢鍊錶中倒數第k個節點?

思想為:兩個指向頭結點的指標,乙個先向後移動k位,然後兩個同時向後面移動直到乙個節點到達鏈尾,前面乙個指標的位置就是了。

node* findlastk(node* head,unsigned int k)

if (count < k)

p = head;

node* q = head;

for (unsigned int i = 0; i < k; i++)

while (p != null)

return q;}

問題6:程式設計序判斷兩個鍊錶是否相交。

這個問題的精彩解說請參見《程式設計之美》一書之《程式設計判斷兩個鍊錶是否相交》,這裡就不寫了,該書的pdf文件在網上很好下。

(1)如果鍊錶可能有環,如何做判斷?

思想為:首先應該明白,只有乙個鍊錶有環的情況下是不會相交的,只有都有環或者都沒有環的情況下才可能相交,都沒有環的情況下最簡便的方法就是判斷鏈尾是否相交即可;都有環的情況下,分別找到環上的任一點,乙個不動,另乙個步進,即可判斷是否相交。

(2)如何求相交鍊錶的第乙個節點?應該為單鏈表情況

思想為:方法一是先把任乙個鍊錶連成環,即從表尾接到表頭,按照問題4的解法;方法二是計算兩個鍊錶的長度,而兩個鍊錶是按照尾部對齊的,那麼從短鍊錶的第乙個位置從長鍊錶的第長度差+1的位置依次比較指標值,相等的位置即是。

void insertcircle(node* head, unsigned int n)

if (n <= count)

p->next = q;

}return;}

void destroy(node* head)

head = head->next;

q->next = null;

destroy(head);

}else}}

鍊錶 鍊錶常見筆試題和面試題 C語言

本文為鍊錶常見的筆試題和面試題,包含鍊錶反轉 判斷鍊錶是否有環 查詢環形入口 查詢公共結點 合併兩個有序鍊錶 查詢倒數第k個結點 查詢中間結點 刪除有序鍊錶重複結點。node list reverse node head node p head node q head next node r q n...

C 筆試題(單向鍊錶)

ifndef f test 2017 11 11 11 jhaskdfjhasf h define f test 2017 11 11 11 jhaskdfjhasf h include 單向鍊錶操作 template struct fsingletonnode 清空節點所有資料 template ...

煉錶筆試題

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