演算法精解(三) C語言描述(鍊錶常見問題)

2021-09-02 13:44:11 字數 2015 閱讀 4397

如果兩個單鏈表相交,那應該呈「y」字形,則交點之後的節點是相同的。

所以判斷是否相交,只需看兩個鍊錶的最後乙個節點是否為同乙個即可。

假設兩個單鏈表的長度分別為l1、l2(l1 > l2),則(l1-l2)的值就是交匯之前兩個鍊錶的長度差;

因此,只有讓更長的鍊錶先走l1-l2步,然後兩個鍊錶開始一起走,如果某次走到乙個相同的節點,該節點即為交點。

typedef struct listnodelistnode;               //定義節點

static int getlistlength(listnode *head)

return n;

}static listnode * findcommonnode(listnode *a,listnode *b)

//相同長度時,同時向下走,指向相同時,則為交點

while(a != null && a != b)

return a;

}

如果乙個單鏈表有環,那應該呈「6」字形或「o」形。

設定兩個指標(fast, slow),初始值都指向頭節點,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定 相遇:如果鍊錶是呈"o"字形,則slow剛好遍歷完一次的時候,與fast相遇;如果呈「6」字形,則更早相遇。

當fast若與slow相遇時,slow還沒有遍歷完鍊錶,而fast已經在環內迴圈了n圈(1<=n)。假設slow走了s步,則 fast走了2s步(fast步數還等於s 加上在環上多轉的n圈),設環長為r,則:

2s = s + nr,簡化為 s= nr

s = x + y,x為鍊錶起點到環入口點的距離,y是slow在環內走過的距離;

可以得到 x = y - s = y - nr,從煉表頭、相遇點分別設乙個指標(p1, p2),每次各走一步,當p1走過距離x時到達入口點,而p2走過的距離為y-nr,y是相遇點與入口點的距離,因此y也走到了入口點,也就是說p1、p2在環入口點相遇了。

//鍊錶是否有環

static listnode* findloopport(listnode* head)

if(fast == null || fast->next ==null) //走完鍊錶,無環

return null;

//有環時,此時fast在相遇點,slow設定為起點,再相遇時,為環入口點

slow = head;

while(slow != fast)

return slow;

}

設定兩個指標(fast, slow),初始值都指向頭節點,slow每次前進一步,fast每次前進二步,當fast走到末尾時,slow剛好指向中間節點。

假設用兩個指標,指標p1先走k-1步,然後指標p2才開始走,當指標p1遍歷完煉表時,p2還剩k-1個結點沒有遍歷,此時,p2為第k個節點,返回p2即可。

//求倒數第n個節點

listnode *findlastknode(listnode *head, int n)

if(p1 == null) return null;

while(p1->next != null)

return p2;

}

static node* reverselist(node* head)

pnode->next = pprev; //斷開原本的鏈,反轉指向

pprev = pnode; //將逆置後的頭,付給pprev,pprev始終為逆置後鍊錶的第一位

pnode = pnext; //將節點後推一位,迴圈反轉

} return head;

}//遞迴實現逆置,此時預設為有頭結點的鍊錶

node* reverselist1(node* head)

else //返回到頭結點時,將已經全部逆置的鍊錶附在頭結點後面,完成逆置。返回頭結點。

}

演算法精解 C語言描述 鍊錶 迴圈鍊錶的實現與分析

同單鏈表相似,迴圈鍊錶中的每個元素也包含兩個部分 乙個資料域指標和乙個指向後繼元素的next指標。資料結構clistelmt代表迴圈鍊錶中的單獨元素。該結構體擁有兩個成員,如上面所述。資料結構clist代表迴圈鍊錶。這個結構體同單鏈表相似,但它不包含tail成員。clist.h ifndef cli...

演算法精解(七) C語言描述(二叉搜尋樹)

二叉樹搜尋樹概念 二叉搜尋樹是一種用於查詢操作的高效資料結構,最壞情況只需查詢乙個分支 的資料即可,而不用檢索所有資料,所以操作的複雜度為o lg n include bitree.h typedef bitree bistree 初始化二叉搜尋樹,compare用於比較key1 key2?1 1 ...

靜態鍊錶 C語言描述

靜態鍊錶 1.下標為0的游標存放最後存放資料節點的游標,即是第乙個沒有存放元素 備用鍊錶 的下標 2.最後乙個的節點存放第乙個由數值得下標 3.第乙個和最後乙個都不存放資料 即是備用鍊錶的第乙個的下標 4.最後乙個儲存資料的節點的游標為0 靜態鍊錶主要是根據游標來遍歷,以前沒有指標用的思想 假如我要...