本文為鍊錶常見的筆試題和面試題,包含鍊錶反轉、判斷鍊錶是否有環、查詢環形入口、查詢公共結點、合併兩個有序鍊錶、查詢倒數第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...