判斷迴文連結串列
題目描述:判斷一個普通的連結串列是否是迴文連結串列,要求時間複雜度O(n),空間複雜度O(1)
解決思路:
- 最簡單的方法是利用棧把連結串列的前半段壓棧,然後出棧與連結串列的後半段逐個比對。找中間位置的方法是快慢指標。
- 還有一種方法是利用快慢指標找到中間,然後將連結串列的後半部分反轉,再依次進行比較,利用的是連結串列反轉的知識。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;
public class Main_ {
class ListNode{
public int val;
ListNode next = null;
public ListNode(int val){
this.val = val;
}
}
//利用棧的思想
public boolean checkPalindrom(ListNode node){
if(node == null)
return false;
Stack<ListNode> stack = new Stack<>();
ListNode fast = node;
ListNode slow = node;
while (fast != null && fast.next != null){
stack.push(slow);
slow = slow.next;
fast = fast.next.next;
}
//如果為奇數個
if(fast != null)
slow = slow.next;
while (!stack.isEmpty()){
if(stack.pop().val != slow.val)
return false;
slow = slow.next;
}
return true;
}
//利用連結串列反轉的思想
public boolean checkPalindrom_(ListNode node){
if(node == null)
return false;
ListNode fast = node;
ListNode slow = node;
while (fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
while (fast != null)
slow = slow.next;
ListNode p = slow.next;
ListNode q = slow.next.next;
slow.next = null;
while(p != null){
p.next = slow;
slow = p;
p = q;
if(q.next != null)
q = q.next;
}
while (slow != null){
if(slow.val != node.val)
return false;
slow = slow.next;
node = node.next;
}
return true;
}
public static void main(String[] args) {
ListNode node1 = new Main_().new ListNode(1);
ListNode node2 = new Main_().new ListNode(2);
ListNode node3 = new Main_().new ListNode(3);
ListNode node4 = new Main_().new ListNode(3);
ListNode node5 = new Main_().new ListNode(1);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = null;
System.out.println(new Main_().checkPalindrom(node1));
System.out.println(new Main_().checkPalindrom(node1));
}
}
相關文章
- 請判斷一個連結串列是否為迴文連結串列。
- 迴文連結串列
- 234. 迴文連結串列
- 判斷是否為環形連結串列
- LeetCode 234. 迴文連結串列LeetCode
- 連結串列-迴圈連結串列
- leetcode 234.迴文連結串列 JavaLeetCodeJava
- 連結串列4: 迴圈連結串列
- 對一個連結串列判斷是否有環
- python如何判斷迴文Python
- 牛客網高頻演算法題系列-BM13-判斷一個連結串列是否為迴文結構演算法
- 判斷單連結串列是否關於中心對陣
- 演算法題:反轉一個單連結串列&判斷連結串列是否有環演算法
- 判斷連結串列是否為迴文結構,空間負責度為O(1),時間複雜度為O(n)時間複雜度
- ACM之判斷迴文數ACM
- 迴圈連結串列
- [Golang]力扣LeetBook—初級演算法—連結串列—迴文連結串列(快慢指標)Golang力扣演算法指標
- 連結串列與遞迴遞迴
- 每天一道leetcode234-迴文連結串列LeetCode
- 資料結構與演算法 | 迴文連結串列檢測資料結構演算法
- 單向迴圈連結串列
- 如何判斷連結串列中是否有環並找出環的入口位置
- 單鏈迴圈連結串列(初版
- 判斷單連結串列中是否存在環,並輸出環入口節點。
- 資料結構之迴圈連結串列資料結構
- 判斷迴文串 字串/數字相互轉換字串
- JS的判斷語句:判斷、迴圈JS
- 單向迴圈連結串列大綱
- 反轉連結串列(遞迴與棧)遞迴
- 一文搞懂雙連結串列
- C語言:判斷一個字串是否為迴文C語言字串
- 連結串列-雙向連結串列
- 連結串列 - 單向連結串列
- 單向迴圈連結串列的介面程式
- 單向迴圈連結串列的實現
- Golang從合併連結串列聊遞迴Golang遞迴
- 【資料結構與演算法學習】線性表(順序表、單連結串列、雙向連結串列、迴圈連結串列)資料結構演算法
- 一文讀懂連結串列反轉(迭代法和遞迴法)遞迴