gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:52:46 25 4
gpt4 key购买 nike

该方法不起作用:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com