C語言鍊錶在筆試面試中常考問題總結

2021-08-27 14:46:08 字數 2937 閱讀 8711

1、實現單鏈表逆置

無頭結點:

1#include 2

#include 3

4typedef

struct

nodenode;8

9//建立鍊錶

10node*createlist(

void)

28p->next=null;

29return

head;30}

31 32//鍊錶的逆置

33node*reverselist(node*head)

43return

r;44}45

46//輸出鍊錶

47void

showlist(node*head)

54printf(

"\n");55}

56 57void

main()

2、判斷單鏈表是否有環

判斷鍊錶是否存在環的辦法為:

設定兩個指標(fast,slow)

,初始值都指向頭指標,

slow

每次前進一步,

fast

每次前進兩步,如果鍊錶存在環,則

fast

必定先進入環,而

slow

後進入環,兩個指標必定相遇。(當然,

fast

先行從頭到尾部為

null

,則為無環鏈表)程式如下: 1

#include 2

#include 3

4typedef

struct

nodenode,*nodelist;8

9bool

i***itsloop(nodelisthead)

17return

!(fast==null||fast->next==null);18}

19 20void

main()

32p=(nodelist)malloc(

sizeof(node));

33p->elem=

6;34

q->next=p;

35q=p;

36q->next=head->next->next->next;

37//判斷單鏈表是否存在環

38printf(

"單鏈表是否存在環

:");

39bool

b=i***itsloop(head);

40printf(

"%s\n"

,b==

false

?"false"

:"true");41}

3、如果單鏈表有環,則找到環的入口點

當fast

若與slow

相遇時,

slow

肯定沒有遍歷完鍊錶,而

fast

已經在環內迴圈了n圈(

1<=n

),假設

slow走了s

步,而fast

走了2s

步(fast

步數還等於

s加上在環上多轉的

n圈),設環長為

r,則:

2s=s+n*r;

s=n*r;

設整個鍊錶長為l

,入口環與相遇點距離為

x,起點到環入口點的距離為a。

a+x=n*r;

a+x=(n-1)*r+r=(n-1)*r+l-a;

a=(n-1)r+(l–a–

x);(l–a–

x)為相遇點到環入口點的距離,由此可知,從煉表頭到環入口點等於

(n-1)

迴圈內環

+相遇點到環入口點,於是我們從煉表頭、與相遇點分別設乙個指標,每次各走一步,兩個指標必定相遇,且相遇第一點為環入口點。程式描述如下: 1

#include 2

#include 3

4typedef

struct

nodenode,*nodelist;8

9//尋找環的入口點

10nodelistfindloopport(nodelisthead)

18if

(fast==null||fast->next==null)

19return

null;

20slow=head;

21while

(slow!=fast)

25return

slow;26}

27 28void

main()

40p=(nodelist)malloc(

sizeof(node));

41p->elem=

6;42

q->next=p;

43q=p;

44q->next=head->next->next->next;

45//尋找環的入口點

46nodelistlist=findloopport(head);

47printf(

"環的入口節點元素值為:

%d\n"

,list->elem);48}

4、判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點(兩個鍊錶都不存在環)

比較好的方法有兩個:

一、將其中乙個鍊錶首尾相連,檢測另外乙個鍊錶是否存在環,如果存在,則兩個鍊錶相交,而檢測出來的依賴環入口即為相交的第乙個點。

二、如果兩個鍊錶相交,那麼兩個鍊錶從相交點到鍊錶結束都是相同的節點,我們可以先遍歷乙個鍊錶,直到尾部,再遍歷另外乙個鍊錶,如果也可以走到同樣的結尾點,則兩個鍊錶相交。這時我們記下兩個鍊錶length

,再遍歷一次,長鍊表節點先出發前進

(lengthmax-lengthmin)

步,之後兩個鍊錶同時前進,每次一步,相遇的第一點即為兩個鍊錶相交的第乙個點。

面試中常見鍊錶問題3 旋轉鍊錶

給定乙個單鏈表和乙個k值,把鍊錶向右旋轉k步,比如說1 2 3 4 5 null和k 2,則返回4 5 1 2 3 null。解析 1 把鍊錶分割成兩部分,前半部的長度為len k,後半部分的長度為k,其中len為鍊錶測長度。2 把後一部分鍊錶的尾指標指向前一部分鍊錶的頭指標。返回後一部分的首指標即...

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

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

面試中常見鍊錶問題1 合併兩個有序鍊錶

給定兩個有序鍊錶,把這兩個鍊錶合併為乙個有序鍊錶。比如鍊錶1 3 5 null和鍊錶2 4 6 null。合併以後為1 2 3 4 5 6 null。方法一 迴圈迭代方法listnode mergetwolists listnode l1,listnode l2 else p p next if l...