这是LinkedList算法的实现。算法在初学者,给定节点之后或列表末尾插入节点。
package LinkedList;
class LinkedList {
Node Head;
class Node {
int data;
Node Next;
public Node(int d) {
data = d;
Next = null;
}
}
public void insert(int value) {
if (Head ==null) {
Head = new Node(value);
return;
}
Node new_node = new Node(value);
new_node.Next = Head;
Head = new_node;
}
public void display() {
Node a = Head;
while (a != null) {
System.out.println("value:" + a.data);
a = a.Next;
}
}
public void insertMiddle(int valueToInsert, Node prev_node) {
if (Head == null) {
System.out.println("Cant put value after last node");
}
Node new_node = new Node(valueToInsert);
new_node.Next = prev_node.Next;
prev_node.Next = new_node;
}
public void last(int value){
Node new_node = new Node(value);
if(Head == null){
Head = new Node(value);
return;
}
new_node.Next = null;
Node last = Head;
while(last != null){
last = last.Next ;
}
last = new_node;
return;
}
}
public class LinkedList_Insertion {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList list = new LinkedList();
list.insert(8);
list.insert(20);
list.insert(0);
list.insertMiddle(999, list.Head.Next);
list.display();
System.out.println("--------------");
list.last(10000);
list.display();
}
}
在上面的代码中,在使用方法插入时:
public void insert(int value) {
if(Head ==null){
Head = new Node(value);
return;
}
Node new_node = new Node(value);
new_node.Next = Head;
Head = new_node;
}
我们为什么不使用Head.next = new_node;
类似地,对于方法:
public void last(int value){
Node new_node = new Node(value);
if(Head == null){
Head = new Node(value);
return;
}
new_node.Next = null;
Node last = Head;
while(last != null){
last = last.Next ;
}
last = new_node;
return;
}
我们为什么不使用last.next = new_node;
?
我经常一次又一次地犯同样的错误。如果有人能清除这个概念,我将不胜感激。
期待你的回复!
答案 0 :(得分:2)
您的第二个密码似乎是错误的,您是正确的,它必须为last.next = newNode
现在回答您的第一个问题,请考虑链接列表100(head),200,300中的3个数字。
在这里,值为100的头节点指向值为200的下一个节点,该节点又必须指向值为300的节点。现在让我们假设您要在100之前插入50,所以当您这样做
Head.next = new_node;
使值为100的节点指向值为50的下一个节点,因此现在链表中的链结数为100,50,头仍为100,这是错误的 所以我们做
new_node.Next = Head;
Head = new_node;
在这种情况下,链接列表变为50,100,200,300。 因此,我们这样做。
答案 1 :(得分:1)
头套:
您可以拥有Head-> node1-> node2-> node3-> ...-> lastNode
如果您执行Head.next = newNode
,则node1-> node2-> node3-> ...-> lastNode将丢失。
如果您有一个双向链接列表,则可以进行Head.prev = newNode; Head = Head.prev
(上一个表示上一个)。
最后一种情况:
此代码:
public void last(int value){
Node new_node = new Node(value);
if(Head == null){
Head = new Node(value);
return;
}
new_node.Next = null;
Node last = Head;
while(last != null){
last = last.Next ;
}
last = new_node;
return;
}
看起来很奇怪,条件实际上应该是while (last.next != null)
,但是即使您没有插入,也要先获得对列表中最后一个元素的引用,然后将该引用指向另一个对象,它应该实际上是last.next = newNode
,您是正确的。
实施链表是了解Java引用如何工作,继续练习并尝试实现双链表的好方法。