面試收集 關於鍊錶的一些面試題

2022-04-10 09:57:15 字數 2986 閱讀 2520

鍊錶相關的面試題是經常出現的,今天總結一下~

1.如何判斷乙個鍊錶是否有環?如果有,找到環的入口?

設定快慢指標,快指標步長為2,慢指標步長為1,如果有環,最終快慢指標會相遇,**如下:

bool hascircle(node* head, node* &encounter)
}
// fast == null || fast->next == null
encounter = null;
return

false;

}
至於如何確定環入口,請看下圖

設入口點距鍊錶頭部head有x步,由於必然相遇,設相遇點距入口點有y步,環長度為r(表示環中有r+1個節點),那麼有判斷相遇的演算法可知

(x+y)*2=nr+(x+y)   => nr=x+y  =>(n-1)r+r-y=x 

由上面的分析可知,設定兩個指標,乙個初始為head,另乙個初始為encounter,同步前進,一旦相遇就是入口,於是有了下面的**:

node* findentry(node* head, node* encounter)
return p1;
}

2. 假設有兩個單鏈表,給出頭指標 head1 和 head 2,判斷兩個鍊錶是否有交點?

先判斷是否有環,不過題目一般會給定無環條件。如果沒有給出,可以判斷,判斷演算法如下:

如果無環,遍歷兩個鍊錶,得到兩個鍊錶的長度m和n,先遍歷較長鍊錶|m-n|次,接著同步遍歷兩個鍊錶,一旦相同,則找到相同節點,否則返回null。

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

這個題目有個trick,正常的思路是利用p前面乙個節點才能刪掉p,但是現在只有p的位址,得不到p前面的位址,那麼只能刪除p後面的節點,刪除之前把p->next的內容複製到p中,注意這個演算法刪除不了最後乙個元素。

4.只給定單鏈表中某個結點p,在p前面插入乙個結點?

思路同3,先在p後面插入乙個節點,然後將p的資料複製到p->next中,在將插入的結點的資料複製到p中

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

同樣是快慢指標問題,設定快指標p_fast,慢指標p_slow,初始均指向head,快指標先走k步,走完k步之後快慢指標同步走,每次走一步,直至快指標走到隊尾。這裡沒有考慮有環的狀況,有環這個題目就無法解了, 如果嚴謹的話要先判斷是否有環。下面是乙個不太嚴謹的演算法。

node *(node *head,int k)
if(count>0)return null;
while(p_fast!=null)
return p_slow;
}
6.找出鍊錶的中間元素(無環)

同樣是快慢指標的問題,快指標慢指標初始都指向head,快指標每次行進兩步,慢指標一步,一旦快指標指向鍊錶尾部,慢指標指向的就是中間元素。實際寫**要考慮一些奇偶情況。

7.鍊錶的就地逆置

頭插法,但是要注意一些特殊情況,**如下:

node* reverselist(node* head)
p1 = head;
p2 = head->next;
while (p2 != null)
head->next = null;
head = p1;
return head;
}
8.複雜鍊錶的複製

這個是程式設計師面試精選的第49題,思路很巧妙,題目意思見鏈結,鍊錶複雜就複雜在於除了有乙個m_pnext指標指向下乙個結點外,還有乙個m_psibling指向鍊錶中的任一結點或者null。其結點的c++定義如下:

struct complexnode
;

解法一旦知曉就沒什麼神秘的了,答案參看鏈結。
9.已知兩個鍊錶head1 和head2 各自有序,請把它們合併成乙個鍊錶依然有序,保留所有結點,即便大小相同,遞迴實現,假設都是公升序排列。

node * merge(node * head1,node *head2)
else
return ret;
}
10.從乙個未排序的鍊錶中刪除重複的元素,給出一種演算法,如果要求不適用額外的空間呢?

如果能用hash表的話,只需要遍歷一次鍊錶,如果發現元素不在hash表中,就插入hash表,反之則刪除。

如果不用額外的空間的話,有個o(n2)的演算法:

linklist removedupnode(linklist l)//刪除重複結點的演算法
else
q=q->next;
}
p=p->next;
}
return l;
}

一些面試題收集

1 const的實現機制 const修飾指標時,如果const位於 的左側,則const就是用來修飾指標所指向的變數,即指標指向乙個常量 如果const位於 的右側,const就是修飾指標本身,即指標本身是常量,指標不能改變。define巨集定義是在預處理階段直接展開的,不會有任何檢查機制。而con...

關於鍊錶的一些筆試面試題

1.逆序列印單鏈表 遞迴 include include include typedef char linktype typedef struct linknodelinknode void linklistreverseprint linknode head if head next null p...

收集整理的一些面試題

1free 函式 問 下面的程式會在使用者輸入 freeze 的時候出問題,而 zebra 則不會,為什麼?include int main int argc,char argv else if argc 1 else if ptr z free ptr return 0 答 這裡的問題在於,會 通...