單鏈表的基本操作(三)兩個鍊錶的交和環

2021-08-19 14:35:58 字數 3225 閱讀 8189

用到的linklist類

/**

* @classname intersect

* @description 單鏈表的交

* @author lzq

* @date 2018/12/8 19:35

* @version 1.0

**/public class intersect

/*** 判斷是否相交

思路:

如果單鏈表有環,可以設乙個快指標first每次走兩步,慢指標last每次走一步,每走一次都要比較,當first與last兩個指標相遇的時候,慢指標last肯定沒有遍歷完鍊錶,而快指標已經在環內迴圈了n圈,假設慢指標last走了s步,那麼快指標因為慢指標每次走一步它走兩步,也就是first走了2s步:

那假設快慢指標在相遇的時候快指標已經在環裡面轉了n圈了,則計算如下:

快指標走的路程  = a+x+n×(x+y);

慢指標走的路程 = a+x;

快指標的速度是慢指標的2倍,而快、慢指標走的時間是相同的,所以從出發到他們相遇有如下公式:

快指標走的路程 = 2×慢指標走的路程

即 : a+x+n×(x+y) = 2×(a+x)

化簡得: n(y+x) = a+x

則: a = n(y+x)-x

那麼只要乙個指標1退回到表頭開始走,乙個指標2從相遇點開始走,注意,現在兩個指標都

一步一步走,他們再一次相遇的時候,一定是環的入口點,因為 a = n(y+x)-x嘛,而指標2是

從距離環的入口點x的位置出發的,那麼等到它以入口點為起點走了n圈的時候,它走的距離是

n(y+x)-x,此時指標1走的距離是a,且a = n(y+x)-x,所以再次相遇的時候一定是環的入口點;

用到的linklist類

/**

* @classname loop

* @description

* @author lzq

* @date 2018/12/8 19:57

* @version 1.0

**/public class loop

cur.next = linklist.gethead().next.next.next;

}/**

* 判斷環,設定兩個引用,其中乙個引用一次走兩步,乙個一次走一步,

* 如果兩個引用在某一位置相遇,則說明有環

* @return

*/public boolean judge(linklistlinklist)

}return false;

}/**

* 獲得環的入口節點,因為快引用是慢引用的兩倍,可以得到在相遇的時候,

* 將某乙個引用放到鍊錶的頭,然後兩個指標都開始一步一步的走,當他們

* 再次相遇的時候就是環的入口點了。

* @return

*/public int obtainentrance(linklistlinklist)

linklist.entry first = linklist.gethead();

linklist.entry last = linklist.gethead();

while(first != null && first.next != null)

}first = linklist.gethead();

while(first != last)

return first.data;

}/**

* 求環的長度,方法1

* @return

*/public int getlooplength1(linklistlinklist)

boolean tag = false;

linklist.entry fast = linklist.gethead();

linklist.entry slow = linklist.gethead();

int count = 1;

while(fast != null&& fast.next != null)

return count;

}/**

* 求環的長度,方法2

* @return

*/public int getlooplength2(linklistlinklist)

linklist.entry first = linklist.gethead();

linklist.entry last = linklist.gethead();

while(first != null && first.next != null)

}last = last.next;

int len = 1;

while(first != last )

return len;}}

鍊錶 兩個單鏈表求差集

問題描述 已知集合a和b的元素分別用不含頭結點的單鏈表儲存,函式difference 用於求解集合a與b的差集,並將結果儲存在集合a的單鏈表中。例如,若集合a 集合b 完成計算後a 鍊錶結點的結構型別定義如下 struct node 請完成函式void difference node la node...

兩個單鏈表生成相加鍊錶

題目 假設鍊錶中每乙個節點的值都在0 9之間,那麼鍊錶整體就可以代表乙個整數。例如9 3 7,代表937.給定兩個這種鍊錶的頭節點head1和head2,請生成代表兩個整數相加值的結果鍊錶。例如 9 3 7和6 3,相加結果為1 0 0 0 兩個單鏈表生成相加鍊錶 方法1 利用棧結構求解 publi...

兩個單鏈表生成相加鍊錶

題目 假設鍊錶中每乙個節點的值都在0 9之間,那麼鍊錶整體就可以代表乙個整數。例如 9 3 7,可以代表整數937.給定兩個兩個這種鍊錶的頭結點head1和head2,請生成代表兩個整數相加值的結果鍊錶。例如 鍊錶1為9 3 7,鍊錶2為6 3,最後生成新的結果鍊錶為1 0 0 0。public c...