鍊錶 回文鍊錶(leetcode234

2022-07-30 10:12:07 字數 1741 閱讀 4912

把鍊錶中所有元素儲存到棧中,也就實現了將鍊錶中的元素逆序存放到棧中。然後再將棧中元素乙個乙個出棧並和鍊錶比對,將鍊錶乙個乙個往下指

時空間複雜度: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...