一個node連結串列翻轉的面試題

趙明威發表於2018-11-18

經典面試題總結,或者我寫的過於囉嗦, 表達了一下想法,歡迎大家來留言區討論
下面列舉了兩種解法:

題目

一個node連結串列的值分別為67,0,24,58,31,請把node翻轉

public static class Node {
    int val;
    Node next = null;
    Node(int val) {
        this.val = val;
    }
}

public static void main(String[] args) {
    Node nodeFirst = new Node(67);
    nodeFirst.next = new Node(0);
    nodeFirst.next.next = new Node(24);
    nodeFirst.next.next.next = new Node(58);
    nodeFirst.next.next.next.next = new Node(31);

    Node node = reverseNodeByNodeMethod(nodeFirst);
    while (node != null) {
        System.out.println(node.val);
        node = node.next;
    }
}

```

一種利用node自身的方法翻轉. 自身的方法翻轉原理圖

public static Node reverseNodeByNodeMethod(Node nodeFirst) {
    Node currentNode = nodeFirst;
    Node nextNode = null;
    Node nextNextNode;
    Node newFirstNode = null;
    if (currentNode.next != null) {
        nextNode = currentNode.next;
    }
    currentNode.next = null;
    while (nextNode != null) {
        if (nextNode.next != null) {
            nextNextNode = nextNode.next;
        } else {
            newFirstNode = nextNode;
            nextNode.next = currentNode;
            break;
        }
        nextNode.next = currentNode;
        currentNode = nextNode;
        nextNode = nextNextNode;
    }
    return newFirstNode;
}

第二種解法,將node所有節點放入stack中,為了防止造成node內部迴圈,所以在stack儲存之後將node.next置為null

第一個向stack新增 一個裝進stack的狀態 除了最後一個不裝 最後結果

public static Node reverseNodeByStack(Node nodeFirst) {
    Stack<Node> stack = new Stack<>();
    Node node = nodeFirst;
    while (node.next != null) {
        Node nextNode = node.next;
        stack.push(node);
        node.next = null;
        node = nextNode;
    }
    Node newFirstNode = node;
    while (!stack.isEmpty()) {
        node.next = stack.pop();
        node = node.next;
    }
    node.next = null;
    return newFirstNode;
}

相關文章