把鍊錶中所有元素儲存到棧中,也就實現了將鍊錶中的元素逆序存放到棧中。然後再將棧中元素乙個乙個出棧並和鍊錶比對,將鍊錶乙個乙個往下指
時空間複雜度:o(n)
public static boolean ispalindrome(listnode head)
stackstack = new stack();
listnode temp = head;
while (temp != null)
while (head != null)
head = head.next;
}return true;
}
鍊錶長度為n,將後n/2的結點放到棧中。壓入完成後,再檢查棧頂到棧底值出現的順序是否和鍊錶左半部分的值相對應
方法二可以直觀地理解為將鍊錶的右半部分「折過去」,然後讓它和左半部分比較
這裡也相當於快慢指標了,叫快指標每次走兩步,慢指標每次走一步,當快指標不難再走的時候,慢指標也到右半區了
**:
public boolean ispalindrome(listnode head)
listnode right = head.next;
listnode curr = head;
while (curr.next != null && curr.next.next != null)
stackstack = new stack<> ();
while (right != null)
while (!stack.isempty())
head = head.next;
}return true;
}
1.將鍊錶右半區反轉,最後指向中間結點
1->2->3->2->1如左圖,1->2->3->3->2->1如右圖
將左半區的第乙個節點記為leftstart,右半區反轉之後最右邊的結點(也就是原鍊錶的最後乙個結點)記為rightstart
2.leftstart和rightstart同時向中間結點移動,移動每步都比較兩者的值
3.不管最後返回結果是什麼,都要把鍊錶恢復成原來的樣子
4.鍊錶恢復原來的結構之後,返回檢查結果
**:
public boolean ispalindrome(listnode head)
listnode n1 = head;
listnode n2 = head;
//找到中間結點
while (n2.next != null && n2.next.next != null)
n2 = n1.next;//n2是右半區的第乙個結點
n1.next = null;
listnode n3 = null;
//右半區反轉
while (n2 != null)
n3 = n1;//n3->儲存最後乙個結點,以便後續恢復用
n2 = head;//n2是左邊第乙個結點
boolean res = true;
//檢查回文
while (n1 != null && n2 != null)
n1 = n1.next;
n2 = n2.next;
}n1 = n3.next;
n3.next = null;
while (n1 != null)
return res;
}
leetcode 鍊錶 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?head null 空鍊錶,回文,返回true head.next null 只有乙個節點的列表,回文,返回tru...
leetcode 鍊錶 回文鍊錶
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false示例 2 輸入 1 2 2 1輸出 true高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?思路 利用快慢指標找到中間節點,當快指標走到末尾時,慢指標指向中間節點 交中間節點之後的節點進行鍊錶反轉 設定指標p1從h...
LeetCode(鍊錶)回文鍊錶 c
請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true definition for singly linked list.struct listnode class solution 將後半部分鍊錶反轉 listnode temp l...