チェーンテーブルが返信チェーンテーブルであるかどうかを判断する
8021 ワード
第1の方法:余分な空間複雑度O(N)、チェーンテーブルを遍歴する時、要素をスタックに入れて、再び遍歴する時、スタックの中から要素を弾き出して、両者の大きさを比較して、回文チェーンテーブルの第2の方法かどうかを判断することができます:速いポインタを利用して、まずチェーンテーブルの中間位置を見つけて、それからチェーンテーブルの後半部分を反転して、それからそれぞれチェーンテーブルの両端から比較的な大きさを遍歴して、最後にチェーンテーブルを元の構造に復元
public class PalindromeLinkedList {
public static void main(String[] args) {
Node head = new Node(1);
head.next = new Node(3);
head.next.next = new Node(5);
head.next.next.next = new Node(5);
head.next.next.next.next = new Node(3);
head.next.next.next.next.next = new Node(1);
display(head);
// , , , ,slow , ,slow ( )
Node fast = head;
Node slow = head;
while(fast.next != null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
}
// slow , slow
Node middle = slow;
//
Node help = slow.next;
// null
slow.next = null;
// help
Node pre = null;
Node next = null;
// ,pre
while(help != null) {
next = help.next;
help.next = pre;
pre = help;
help = next;
}
//
boolean flag = true;
Node first = head;
Node second = pre;
while(first != null && second != null) {
if(first.value != second.value) {
flag = false;
break;
}
first = first.next;
second = second.next;
}
System.out.println(flag);
//
Node help_restore = pre;
Node pre_restore = null;
Node next_restore = null;
while(help_restore != null) {
next_restore = help_restore.next;
help_restore.next = pre_restore;
pre_restore = help_restore;
help_restore = next_restore;
}
middle.next = pre_restore;
display(head);
}
public static void display(Node head) {
StringBuilder sb = new StringBuilder();
while (head != null) {
sb.append(head.value + " -> ");
head = head.next;
}
String res = sb.substring(0, sb.lastIndexOf(" -> "));
System.out.println(res);
}
public static class Node{
public int value; //
public Node next; //
public Node(int value) {
this.value = value;
}
}
}