給定乙個鍊錶的頭節點 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.當前節點可以達到後面節點的位...