刷面試寶典和劍指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 ...