鍊錶問題 打卡6 三種方法帶你優雅判斷回文鍊錶

2022-04-12 10:27:11 字數 1789 閱讀 4081

給定乙個鍊錶的頭節點 head, 請判斷該鍊錶是否為回文結構。

例如:1->2->1,返回 true.

1->2->2->1, 返回 true。

1->2->3,返回 false。

如果鍊錶的長度為 n, 時間複雜度達到 o(n)。

普通解法:士:★☆☆☆

高階解法:尉:★★☆☆

方法1

我們可以利用棧來做輔助,把鍊錶的節點全部入棧,在乙個乙個出棧與鍊錶進行對比,例如對於鍊錶 1->2->3->2->2,入棧後如圖:

然後再逐一出棧與鍊錶元素對比。

這種解法比較簡單,時間複雜度為 o(n), 空間複雜度為 o(n)。

**如下

//方法1

public static boolean f1(node head)

node temp = head;

stackstack = new stack<>();

while (temp != null)

while (!stack.isempty())

head = head.next;

}return true;

}

方法二真的需要全部入棧嗎?其實我們也可以讓鍊錶的後半部分入棧就可以了,然後把棧中的元素與鍊錶的前半部分對比,例如 1->2->3->2->2 後半部分入棧後如圖:

然後逐個出棧,與鍊錶的前半部分(1->2)對比。這樣做的話空間複雜度會減少一半。

**如下:

//方法2

public static boolean f(node head)

system.out.println(slow.value);

slow = slow.next;

while (slow != null)

//進行判斷

while (!stack.isempty())

head = head.next;

}return true;

}

方法三:空間複雜度為 o(1)。

上道題我們有作過鍊錶的反轉的,沒看過的可以看一下勒:【鍊錶問題】如何優雅著反轉單鏈表],我們可以把鍊錶的後半部分進行反轉,然後再用後半部分與前半部分進行比較就可以了。這種做法額外空間複雜度只需要 o(1), 時間複雜度為 o(n)。

**如下:

//方法3

public static boolean f2(node head)

node revhead = reverse(slow.next);//反轉後半部分

//進行比較

while (revhead != null)

head = head.next;

revhead = revhead.next;

}return true;

}//反轉鍊錶

private static node reverse(node head)

node newhead = reverse(head.next);

head.next.next = head;

head.next = null;

return newhead;

}

思考:如果給你的是乙個環形鍊錶,並且指定了頭節點,那麼該如何判斷是否為回文鍊錶呢?無無

未知。無。此題為開放題,你可以根據這個設定各種其他要求條件。

鍊錶建立的三種方法

作為最常用的資料結構之一,鍊錶被廣泛應用在各個方面,下至作業系統底層的驅動程式上至各種應用軟體,都處處可以看到鍊錶的身影,皆因其操作的簡便與應用的高效性。總結個人目前所學,鍊錶的建立方式主要有 以下幾種方法 方法一 struct link node struct link node list nul...

鍊錶逆置 三種方法詳解

achievek 本題要求實現乙個函式,將給定的單鏈表逆轉。函式介面定義 list reverse list l 其中list結構定義如下 typedef struct node ptrtonode struct node typedef ptrtonode list 定義單鏈表型別 l是給定單鏈表...

leecode206 鍊錶反轉 三種方法

第一種 記錄前驅,從第乙個節點開始 1.用乙個指標記錄其next的位置 防止在其指向前面節點無法指向後面的節點的位置 q p next 2.記錄了後面的位置,那我們可以大膽的將p next指向前驅節點pre p next pre 3.前驅節點變為當前節點 pre p 4.當前節點可以達到後面節點的位...