判斷一個連結串列是否為迴文結構 & 將單向連結串列按某值劃分成左邊小、中間相等、右邊大的形式
阿新 • • 發佈:2021-11-14
判斷一個連結串列是否為迴文結構
《程式設計師程式碼面試指南》第18題 P55 難度:士★☆☆☆(普通解法)| 尉★★☆☆(進階解法)
普通解法很簡單,我也秒想出來,用棧來解決。
將連結串列的左半部分依次壓入棧中,然後從右半部分第一個節點開始,逐一與彈出的棧頂作比較;
全部相等,則是迴文結構;否則不是。
牛客題解程式碼如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; /** * @描述:判斷一個連結串列是否為迴文結構 * @思路: * 1. 將連結串列的右半區入棧 * 2.檢查棧中的值和順序是否與未入棧的一致 * @複雜度:時間O(N) * @連結:https://www.nowcoder.com/practice/4b13dff86de64f84ac284e31067b86e2 */ class Palindrom { public static boolean isPalindrom(Node head) { //檢驗 if(head == null || head.getNext() == null) { return false; } //--找到右半區的頭結點 Node right = head.getNext(); //從第二個結點開始 Node last = head; while (last.getNext() != null && last.getNext().getNext() != null) { right = right.getNext(); last = last.getNext().getNext(); } //--將連結串列的右半區入棧 Stack<Integer> stack = new Stack<>(); while (right != null) { stack.push(right.getValue()); right = right.getNext(); } //--檢查棧中的值和順序是否與未入棧的一致 Node node = head; while (!stack.isEmpty()) { if(stack.pop() != node.getValue()){ return false; } node = node.getNext(); } return true; } public static void main(String[] args) { Node head = Node.createNodeList(new Integer[]{1, 2, 3, 4, 5}); System.out.println(Palindrom.isPalindrom(head)); } } public class Main{ public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String n = in.readLine(); String[] items = in.readLine().split(" "); Node head = Node.createNodeList(items); System.out.println(Palindrom.isPalindrom(head)); } } class Node { private Node next; private int value; public Node(int value) { this.value = value; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public static Node createNodeList(Integer[] values) { Node head = new Node((values[0])); Node node = head; for (int i = 1; i < values.length; i++) { Node newNode = new Node(values[i]); node.next = newNode; node = newNode; } return head; } public static Node createLoopNodeList(Integer[] values) { Node head = new Node((values[0])); Node node = head; for (int i = 1; i < values.length; i++) { Node newNode = new Node(values[i]); node.next = newNode; node = newNode; } node.setNext(head); return head; } public static Node createNodeList(String[] values) { Node head = new Node(Integer.parseInt(values[0])); Node node = head; for (int i = 1; i < values.length; i++) { Node newNode = new Node(Integer.parseInt(values[i])); node.next = newNode; node = newNode; } return head; } public static void printNodeList(Node head) { StringBuilder sb = new StringBuilder(); while (head != null) { sb.append(head.getValue()).append(" "); head = head.getNext(); } System.out.println(sb.toString()); } public static void printLoopNodeList(Node head) { if (head == head.getNext()) { //只有一個節點 System.out.println(head.getValue()); } else { StringBuilder sb = new StringBuilder(); Node last = head; while (last.getNext() != head) { sb.append(last.getValue()).append(" "); last = last.getNext(); } System.out.println(sb.toString()); } } }