C C 中煉表操作

2021-07-12 04:54:35 字數 1679 閱讀 2007

刷面試寶典和劍指offer過程中,鍊錶的操作是非常重要的一塊兒,這裡把遇到的問題彙總一下,值得注意的是,鍊錶的很多技巧都是通過前後指標實現的。

如果知道鍊錶的長度len,就比較容易了,倒數第k個節點就是正數第len-k+1個節點,直接遍歷就行了。如果len是未知的,當讓也可以先遍歷一次整個鍊錶數出長度,然後在從頭開始找到第len-k+1個,這樣其實遍歷了兩次鍊錶。

但是,能不能只遍歷一次就找到倒數第k個節點呢。當然了,可以使用前後兩個指標,開始時,前邊的指標比後邊的指標超前 k-1 步,然後兩個指標同時向後移動,當前邊的指標到達尾節點時,後邊的指標指的就是倒數第k個節點。

struct node;

node* findlastkth(node* phead, int k)

//兩個指標同時向後移動

while(pahead->next != null)

return pbehind;

}

有幾處需要處理的細節:

1. 輸入的鍊錶為空

2. k為0,或者 k > len

3. 函式在特殊情況返回null,如果在主函式中有數出節點值的操作需要判斷是否是null。

同樣考慮前後(快慢)指標的技巧:乙個指標每次走一步,另乙個每次走兩步,如過存在環,那麼兩個指標肯定能相遇;如果走的快的指標走到了尾節點兩指標沒有相遇,則不存在環。

bool hascircle(node* head)

else

break;

}if(pfast == pslow)

return

true;

else

return

false;

}

如果鍊錶的節點個數是偶數,可以輸出中間兩個的任意乙個。

這個問題同樣可以使用快慢指標,乙個指標每次走兩步,另乙個每次走一步。當快指標到達末尾時,慢指標指向的就是中間節點。

node* find_mid_node(node* head)

}return pbehind;

}

乙個鍊錶中存在環,找出環的入口節點。

如果知道環中節點的個數n,可是使用前後指標,前邊的指標先後n步,然後兩個指標同時向前走。當兩個指標相遇時,指向的就是環的入口節點。

怎麼得到環中節點的個數呢?可以借鑑(三)的方法,找到環中的任意乙個節點,然後用乙個指標從該節點遍歷,當再次遍歷的該節點時,正好走了一圈,可以輸出節點個數。

//找到環中的任意節點,如果不存在環,返回null

node* find_meet_node(node* head)

else

break;

}if(pfast == pslow)

return pfast;

else

return null;

}//數環中節點個數,找到入口

node* entryofcircle(node* head)

//前後指標,遍歷鍊錶

node* pa = head;

node* pb = head;

for(int i=0; i < nums; i++)

pa = pa->next;

while(pa != pb)

return pa;

}

線性鍊錶基本操作實現(C C )

函式結果狀態 define true 1 define false 0 define ok 1 define error 0 define infeasible 1 define null 0 define overflow 2 include include include using names...

C C 鍊錶詳解

前言 該文章內容的第一大塊是單獨功能的講述,比如鍊錶的插入,刪除,查詢等操作 第二大塊是整個鍊錶的乙個完整操作示例。這兩個模組沒有任何關聯,以防誤解。1 準備內容 include include include 2 結構體我們鍊錶需要儲存的資料 typedef struct node person ...

C C語言實現的鍊錶及其各種鍊錶操作

include includetypedef struct lnode lnode,linklist lnode 結構體型別,linklist 結構體指標 typedef enum bool lnode 等價於 linklist 頭插法 linklist creatlist1 linklist l ...