双向链表,在 Java 中的给定节点之前插入
Doubly Linked List, Insert Before A Given Node in Java
方法无效:
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;
}
}
双链表class:
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/
我先创建一个linkedlist,insert_front()一个值让head不为null,然后用上面的方法插入别的东西。插入到前端,结束,节点之后都可以工作,但是这个 insert_before_node() 不工作。我用这种方法插入的内容没有出现在我的打印件上。
我也在纸上画了,还是没找到问题
geeksforgeeks link 也没有 java 此方法的实现。
我编辑代码以提高可读性。
public void insert_before_node(Node next, int data) {
Node newNode = new Node(data);
Node prev = next.prev;
//left to right
prev.next = newNode;
newNode.next = next;
//traverse right to left
next.prev = newNode;
newNode.prev = prev;
}
我假设下一个和上一个也不为空。
顺便说一句,您应该在 insert_before_node 中添加更多条件来检测 null(下一个和上一个)。
请更新结果,希望对您有所帮助。
你的代码是有效的,除了insert_front(Node,int)
方法中head的赋值,我想你之前忘记了this.
。
此外,也许您需要
- 删除
insert_front
方法中的 head 参数(它是 dll 的头部,它有一个 class 成员),
- 删除下划线(不是 Java 好的做法,Sonar 会抱怨)
- return 您创建的节点,以便您稍后可以引用它们(并可能创建流畅的 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);
}
}
}
}
方法无效:
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;
}
}
双链表class:
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/
我先创建一个linkedlist,insert_front()一个值让head不为null,然后用上面的方法插入别的东西。插入到前端,结束,节点之后都可以工作,但是这个 insert_before_node() 不工作。我用这种方法插入的内容没有出现在我的打印件上。
我也在纸上画了,还是没找到问题
geeksforgeeks link 也没有 java 此方法的实现。
我编辑代码以提高可读性。
public void insert_before_node(Node next, int data) {
Node newNode = new Node(data);
Node prev = next.prev;
//left to right
prev.next = newNode;
newNode.next = next;
//traverse right to left
next.prev = newNode;
newNode.prev = prev;
}
我假设下一个和上一个也不为空。
顺便说一句,您应该在 insert_before_node 中添加更多条件来检测 null(下一个和上一个)。 请更新结果,希望对您有所帮助。
你的代码是有效的,除了insert_front(Node,int)
方法中head的赋值,我想你之前忘记了this.
。
此外,也许您需要
- 删除
insert_front
方法中的 head 参数(它是 dll 的头部,它有一个 class 成员), - 删除下划线(不是 Java 好的做法,Sonar 会抱怨)
- return 您创建的节点,以便您稍后可以引用它们(并可能创建流畅的 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);
}
}
}
}