資料結構與演算法隨筆之鍊錶 鍊錶是否有環 二

2021-09-13 08:10:35 字數 1128 閱讀 1342

題目描述

給定乙個鍊錶,判斷鍊錶中是否有環

解決方案

一、可以使用hash表來實現,遍歷鍊錶,每個節點放入hash表中,如果hash表中包含了某個節點,那麼說明有重複節點存在,即是有環。如果沒環,那麼鍊錶會遍歷結束。**如下:

public static > boolean hascycle1(nodehead) 

set.add(n);

}return false;

}

複雜度分析,假設鍊錶長度為n

二、上面這種方法可以解決,但是需要借助額外的空間複雜度,能否不使用額外空間解決此題呢?答案是有的,使用快慢指標,想象下,兩個人在乙個環形跑道上賽跑,跑得快的一定會追上跑的慢的那個人吧。下面用圖示來展示下整個過程。

初始化時:

fast指標走兩步,slow指標走一步,不停遍歷的變化:

最後快慢指標又相遇了,迴圈結束,**實現如下:

public static > boolean hascycle(nodehead) 

nodeslow = head;

nodefast = head;

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

}return false;

}

複雜度分析,假設鍊錶長度為

資料結構與演算法之鍊錶

鍊錶的分類 1 單鏈表 頭插法 只需要維護乙個頭結點即可,常用來模擬堆疊 尾插法 需要維護頭結點和尾結點,常用來模擬佇列。2 雙向鍊錶 雙向遍歷,可以用來儲存網頁的歷史記錄等 3 迴圈鍊錶 經常出現在面試題中,判斷鍊錶是否有環。鍊錶的刪除 方式一 維護兩個指標,current 表示當前節點 和pre...

資料結構與演算法之鍊錶

線性表 線性表的定義 一些元素的序列,維持著元素之間的線性關係。實現線性表的基本需要是 1 能夠找到表首元素 2 從表裡的任意元素出發,能找到它之後的下乙個元素 基於鏈結技術實現的線性表稱為鍊錶。單鏈表 單鏈表的特點總結如下 1 乙個單鏈表由一些具體的表結點組成 2 每個節點是乙個物件,有自己的標識...

資料結構與演算法 鍊錶

題目 合併兩個已經排序好的鍊錶 非遞迴和遞迴兩種 方法1 cpp view plain copy print color 000000 合併鍊錶.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std struct listnod...