面試題 單鏈表的操作

2021-06-26 08:52:46 字數 2679 閱讀 7470

面試題:單鏈表的操作

1、找出單鏈表的中間節點

2、找出單鏈表的倒數第k個節點

3、判斷單鏈表的是否有環

4、兩個有序的單鏈表的合併

5、單鏈表就地逆置

#include #include typedef struct node

linknode;

/*****初始化*******/

void init(linknode **head)

/**********建立節點**********/

linknode *create(int value)

head->data = value;

head->next = null;

return head;

}/*******連線相鄰節點**********/

void connectlinknode(linknode *cur, linknode *p)

else }

/*****尾插法*******/

void insert_tail(linknode **head, int value)

p->data = value;

p->next = null;

linknode *q = *head;

if(q==null) //如果是第乙個節點

else }

/****** 遍歷鍊錶*******/

void display(linknode *head)

linknode *p = head;

while(p!=null) }

/**************尋找倒數第k個節點********************/

linknode *findnodefromend(linknode *head, int k)

else

} while(p->next != null)

return q;}/*

* 求鍊錶的中間結點。如果鍊錶中結點總數為奇數,返回中間結點;

* 如果結點總數是偶數,返回中間兩個結點的任意乙個。

* 為了解決這個問題,我們也可以定義兩個指標,同時從鍊錶的頭結點出發,

* 乙個指標一次走一步,另乙個指標一次走兩步。

* 當走得快的指標走到鍊錶的末尾時,走得慢的指標正好在鍊錶的中間。**/

linknode *findmidnode(linknode *head)

return pmid;}/*

*判斷乙個單向鍊錶是否形成了環狀結構。

*定義兩個指標,同時從鍊錶的頭結點出發,乙個指標一次走一步,

*另外乙個指標一次走兩步。如果走得快的指標追上了走得慢的指標,

*那麼鍊錶就是環狀結構;如果走得快的指標走到了

*鍊錶的末尾(m_pnext指向null)都沒有追上走得慢的指標,

*那麼鍊錶就不是環狀結構。**/

int iscirclelist(linknode *head)

linknode *p = head;

linknode *q = head;

while((p->next != null) && (p->next->next != null))

return 0;

}/*************鍊錶的倒置*******************/

linknode *reverse(linknode *head)

return pre;

}/****************兩個有序的鍊錶合併********************/

linknode *merge(linknode *head1, linknode *head2)

else

return head;

}void main()

display(head);

printf("\n");

for(i=0; i<10; i=i+2)

display(head1);

printf("\n");

p = merge(head, head1);

display(p);

printf("\n");

display(reverse(p));

int k=2;

p = findnodefromend(head, k);

printf("\n倒數第%d個節點是 %d\n", k, p->data);

p = findmidnode(head);

printf("中間節點是 %d\n", p->data);

linknode *p1 = create(1);

linknode *p2 = create(2);

linknode *p3 = create(3);

linknode *p4 = create(4);

linknode *p5 = create(5);

connectlinknode(p1, p2);

connectlinknode(p2, p3);

connectlinknode(p3, p4);

connectlinknode(p4, p5);

connectlinknode(p5, p1);

if(iscirclelist(p1)==1)

else if(iscirclelist(p1)==0)

}

面試題 單鏈表的操作2

單鏈表的建立 插入等替他操作見本人部落格 單鏈表的基本操作 面試題 單鏈表的操作1 介紹了4種有關單鏈表的面試題,對於以下鍊錶要求的實現,解題的思路很重要。例如兩個有序鍊錶的合併,實現約瑟夫環及鍊錶成環問題。各函式的實現,如下 slistnode mergelist slistnode l1,sli...

單鏈表的面試題

自定義標頭檔案部分 void deletenottail pnode pos 刪除乙個無頭單鏈表的非尾節點 void insertnothead pnode phead,pnode pos,datatype data 在無頭單鏈表的乙個非頭節點前插入乙個節點 void josephcircle pn...

面試題 單鏈表反轉

問題 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。一 非遞迴演算法 假設有鍊錶a b c d e f g。在反轉鍊錶過程中的某一階段,其鍊錶指標指向為 a b c d e f g。也就是說在結點d之前的所有結點都已經反轉,而結點d後面的結點e開始的所有結點都沒有反轉。這樣...