面試題:單鏈表的操作
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開始的所有結點都沒有反轉。這樣...