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

2021-09-24 11:52:46 字數 2061 閱讀 8764

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

node*

list_reverse

(node* head)

node* p = head;

node* q = head->next;

node* r = q->next;

p->next =

null

;while

(r) q->next = p;

return q;

}

方法

定義兩個指標slow和fast,開始時都指向頭結點,然後slow指標每次移動乙個結點,fast每次移動兩個結點,如果他們能夠相遇在同一結點,則鍊錶有環。

bool has_cycle

(node* head)

return false;

}

方法

由上述分析,我們可以分解為以下幾個步驟:

node*

cycle_entry

(node* head)

if(fast)

return slow;

}return

null

;}

方法一

方法二

我們使用第二個方法可以分解為以下幾個步驟:

size_t list_len

(node* head)

return len;

}node*

list_public

(node* head1,node* head2)

//兩煉表以同樣的速度同時出發,相遇的結點就是公共結點

while

(short_list && long_list)

return

null

;}

寫遞迴我們要有框架思維,不用一層一層的分解,找出規律最重要

node*

merge_two_list

(node* head1, node* head2)

else

}

方法一

先遍歷整個鍊錶,獲取鍊錶的長度n,然後從頭再次遍歷到n-k個結點

方法二

我們使用第二個方法可以分解為以下幾個步驟

node*

last_k

(node* head,

int k)

while

(src->next)

return dst;

}

查詢中間結點, 如果中間結點為兩個,返回較小的那個

方法一先遍歷整個鍊錶,獲取鍊錶的長度n,然後從頭再次遍歷到n/2個結點

方法二

node*

find_middle

(node* head)

return slow;

}

刪除所有含有重複數字的節點,只保留原始鍊錶中 沒有重複出現的數字。方法

步驟 如果cur->data不等於sec->data,將pre,cur,sec指標都往後移乙個結點。

node*

del_repeat

(node* head)

//逐個刪除重複的資料

while

(cur != sec)

if(pre ==

null

) head_tmp = cur;

else

pre->next=cur;

if(sec)

sec = sec->next;

}else

}return head_tmp;

}

鍊錶常見筆試題

鍊錶的一些常見筆試面試問題總結及 先什麼也不說,假設鍊錶節點的資料結構為 struct node 建立單鏈表的程式為 struct node create unsigned int n node p head for unsigned int i 1 i n i return head 問題1 鍊錶...

鍊錶常見面試題

1 如何判斷乙個單鏈表有環 2 如何判斷乙個環的入口點在 3 如何知道環的長度 4 如何知道兩個單鏈表 無環 是否相交 5 如果兩個單鏈表 無環 相交,如何知道它們相交的第乙個節點是什麼 6 如何知道兩個單鏈表 有環 是否相交 7 如果兩個單鏈表 有環 相交,如何知道它們相交的第乙個節點是什麼 1 ...

關於鍊錶的筆試 面試題

以下題目 於leetcode 有兩個鍊錶,它們表示逆序的兩個非負數。計算出兩個數的和之後,同樣逆序輸出作為乙個鍊錶 比如 2 1 3 5 6 4 得到 7 0 8 add two numbers class solution if carry 0 prev next new listnode car...