C 快慢指標的應用

2021-09-27 00:14:15 字數 2464 閱讀 7837

快慢指標的應用

(1)判斷單鏈表是否存在環

如果鍊錶是乙個環,就好像操場的跑道是乙個環一樣,此時快慢指標都從煉表頭開始遍歷,快指標每次向前移動兩個位置,慢指標每次向前移動乙個位置;如果快指標到達null,說明鍊錶以null為結尾,沒有環。如果快指標追上慢指標,則表示有環。**如下:

bool

hascircle

(node *head)

return

false;}

}

(2)在有序鍊錶中尋找中位數

慢指標移動的速度是快指標移動速度的兩倍,因此當快指標到達鍊錶尾部的時候,慢指標剛好到達中點。

程式還要考慮鍊錶節點個數的奇偶數因數,當快指標移動x次後到鍊錶尾(1+2x),說明鍊錶有奇數個節點,直接返回慢指標指向的資料即可。

如果快指標是倒數第二個結點,說明鍊錶結點個數是偶數,這時可以根據「規則」返回上中位數或下中位數或(上中位數+下中位數)的一半。

while

(fast && slow)

else

if(fast-

>next !=

null

&& fast-

>next-

>next ==

null

)else

}

(3)判斷鍊錶是否存在環,如果存在,找到環入口

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶尾部形成乙個環。

如果判斷乙個鍊錶是否存在乙個環?設定兩個指標slow,fast,均從頭指標開始,每次分別前進1步、2步。如果存在環,則兩者相遇;如不存在環,fast遇到null退出。

如果鍊錶存在環,如果找到環的入口點?當fast與slow相遇時,slow肯定沒有走遍歷完鍊錶或者恰好遍歷一遍。於是我們從煉表頭與相遇點分別設乙個指標,每次各走一步,兩個指標必定相遇,則相依的第乙個點為環入口點。

node*

findloopport

(node *head)}if

((fast ==

null)||

(fast -

>next ==

null))

//第二步:尋找環的入口點

slow = head;

//讓slow回到鍊錶的起點,fast留在相遇點

while

(slow != fast)

reurn slow;

}

(4)判斷兩個單鏈表是否相交,如果相交找到他們的第乙個公共節點

判斷兩個鍊錶是否相交,如果相交,給出相交的第乙個點(假設兩個鍊錶不存在環)。

思路

首先利用快慢指標判斷鍊錶是否存在環。

(a)如果不存在環,則如果兩個單向鍊錶有公共節點,也就是兩個鍊錶從某一節點開始,他們的p_next都指向同乙個節點,每乙個節點只有乙個p_next。因此從第乙個公共節點開始,之後他們所有節點都是重合的。因此,首先兩個鍊錶先遍歷一次,求兩個鍊錶的長度分別是l1、l2,然後可以得到他們的長度差l。然後先在長的鍊錶上遍歷l個節點,之後再同步遍歷,於是在遍歷中,第乙個相同節點就是第乙個公共節點。此時,若兩個鍊錶長度分別是m、n,則時間複雜度為o(m+n)。

void

is_2list_intersect

(linklist l1, linklist l2)

linklist p = l1;

linklist q = l2;

int l1_length =0;

int l2_length =0;

int len =0;

while

(p->next)

while

(q->next)

printf

("p: = %d\n"

, p)

;printf

("q: = %d\n"

, q)

;printf

("l1_length: = %d\n"

, l1_length)

;printf

("l2_length: = %d\n"

, l2_length);if

(p ==q)

else

while

(len)

while

(p != q)

printf

("相交的第乙個結點是:%d\n"

,p->data);}

else

}

(b)如果乙個存在環,另乙個不存在環,則這兩個鍊錶是不可能相交的。

(c)如果利用快慢指標發現兩個鍊錶都存在環,則判斷任意乙個鍊錶上快慢指標相遇的那個節點,在不在另外乙個節點上,如果在,則相交,不在,則不相交。

快慢指標的應用

1 definition for singly linked list.2 public class listnode 9 10 11public class solution 16 listnode slow head 17 listnode fast head 18while fast null...

快慢指標的常見應用

快慢指標 快慢指標是解決陣列和鍊錶問題的常用方法,該方法也被稱為 龜兔演算法 從名稱就可以看出氣基本思想是使用兩個指標以不同的速度在陣列或鍊錶中移動。在處理迴圈鍊錶或陣列時,此方法非常有用。快慢指標的應用 1 判斷單鏈表是否存在環 如果鍊錶存在環,就好像操場的跑道是乙個環形一樣,此時讓快慢指標都從煉...

C語言快慢指標

include include include 用到了time函式,所以要有這個標頭檔案 define false 0 define true 1typedef int status typedef int elemtype typedef struct node node typedef stru...