java - 双向链表,在Java中的给定节点之前插入

标签 java linked-list doubly-linked-list

该方法不起作用:

public void insert_before_node(Node givenNode, int data) {
    Node newNode = new Node(data);
    newNode.prev = givenNode.prev;
    givenNode.prev = newNode;
    newNode.next = givenNode;

    if(newNode.prev != null)
        newNode.prev.next = newNode;
}

另一种有效的添加方法:

public void insert_front(int data) {
    Node newNode = new Node(data);
    newNode.next = head;
    newNode.prev = null;

    if(head != null)
        head.prev = newNode;
    head = newNode;
}

用于调试的打印方法:

public void print() {
    Node n = head;
    while(n != null){
        System.out.println(n.data);
        n = n.next;
    }
}

双链表类:

public class DoublyLinkedList {

    static class Node {
        int data;
        Node next;
        Node prev;

        Node(int data) {
            this.data = data;
            this.next = null;
            this.prev = null;
        }
    }

    Node head;

    DoublyLinkedList() {
        this.head = null;
    }

public static void main(String[] args) {

    DoublyLinkedList ll = new DoublyLinkedList();
    ll.insert_front(0);
    ll.insert_before_node(ll.head, 100);

    ll.print();

}
}

LinkedList 和 Node 的实现非常简单。在这里找到:https://www.geeksforgeeks.org/doubly-linked-list/

我首先创建一个链表,insert_front()一个值使头部不为空,然后使用上面的方法插入其他东西。插入到前端、后端、节点之后都可以工作,但是,这个 insert_before_node() 不起作用。我用此方法插入的内容没有出现在我的打印中。

我也在纸上画了,还是没发现问题。

geeksforgeeks 链接也没有此方法的 java 实现。

最佳答案

您的代码正在运行,除了 insert_front(Node,int) 方法中的 head 分配之外,我认为您在此之前忘记了 this.

另外,也许你需要

  • 删除 insert_front 方法中的 head 参数(它是 dll 的头部,它有一个类成员),
  • 删除下划线(这不是 Java 的好习惯,Sonar 会提示)
  • 返回您创建的节点,以便您稍后可以引用它们(并可能创建流畅的 API)

基本的返工看起来像这个 MVP:

import java.util.Objects;

public class DoubleLinkLists {

    public static void main(String[] args) {
        DoubleLinkedList dll = new DoubleLinkedList();

        DoubleLinkedList.Node node5 = dll.insertInFront(5);
        DoubleLinkedList.Node node4 = dll.insertInFront(4);
        DoubleLinkedList.Node node2 = dll.insertInFront(2);
        DoubleLinkedList.Node node1 = dll.insertInFront(1);
        DoubleLinkedList.Node node3 = dll.insertBefore(node4, 3);

        System.out.println(dll);
    }


    public static class DoubleLinkedList {
        Node head;

        @Override
        public String toString() {
            Node current = head;
            StringBuilder sb = new StringBuilder();

            while (current != null) {
                sb.append(current.data)
                  .append(" ");
                current = current.next;
            }

            return sb.toString();
        }

        public Node insertBefore(Node givenNode, int data) {
            Node newNode = new Node(data);
            newNode.prev = givenNode.prev;
            givenNode.prev = newNode;
            newNode.next = givenNode;

            if (newNode.prev != null) {
                newNode.prev.next = newNode;
            }

            return newNode;
        }

        public Node insertInFront(int data) {
            Node newNode = new Node(data);
            newNode.next = head;
            newNode.prev = null;

            if (head != null) {
                head.prev = newNode;
            }

            head = newNode;
            return newNode;
        }

        public static class Node {
            int data;

            Node prev;

            Node next;

            Node(int d) {
                data = d;
            }

            @Override
            public boolean equals(Object o) {
                if (this == o) return true;
                if (o == null || getClass() != o.getClass()) return false;
                Node node = (Node) o;
                return data == node.data;
            }

            @Override
            public int hashCode() {
                return Objects.hash(data);
            }
        }
    }
}

关于java - 双向链表,在Java中的给定节点之前插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52723066/

相关文章:

java - 双向链表删除方法

c - 通过交换节点对双向链表进行排序

c - 在 C 中通过引用传递删除列表中的节点

java - 获取当前正在显示的 JEditorPane

java - JPA不使用序列

C - 传递 'strcmp' 的参数 1 使指针来自整数而不进行强制转换

c - 打印从文件 csv 读取输入的结构链接列表的问题

java - 在java中的递归链表中搜索项目的索引

java - 什么是固定对象溢出?

java - 为什么在运行 activator run cmd 时需要获取 org.scalasbt sbt?