我正在开发一个不使用Java内置的Linked List类的程序;我正在从头开始构建它。除了编写一个将Node插入到链表的特定位置的方法之外,我已经成功完成了所有事情。
我有一个方法将特定节点设置为“当前”节点。因此,例如,我有一个链接列表,如下所示: cats - > 狗 - > 制作 - > 好 - > 宠物,“当前”等于2;这意味着“当前”节点是“狗”。
从这里开始,假设我想在“当前”位置插入一个新节点,其信息字段为和。如果操作正确,最终的链接列表将是: cats - > 和 - > 狗 - > 制作 - > 好 - >的宠物; “和”将取代第2位的“狗”。
所以这是我的问题:我的方法是在第二个位置插入一个新节点,但是将新创建的节点链接到预先存在的节点会出错。我不仅将新节点插入列表中,而且还在“狗”之前插入没有信息的节点。正如我的代码目前运行,输出如下所示: cats - > 和 - > (空白) - > 狗 - > 制作 - > 好 - >的宠物
我99.9%肯定问题出在代码的(如果是当前的!= null)部分,我只是无法弄清楚如何修复它。
除了我想要添加的节点之外,还有任何关于我为什么要插入空节点的想法?
public void insert () {
System.out.println("Please enter the text you wish to insert, or type \"end\" if you are done inserting.");
String theString;
theString = console.nextLine();
while (!theString.equals("end")){
newNode = new Node ();
newNode.info = theString;
newNode.next = null;
if (first == null){
first = newNode;
last = newNode;
} else if (current != null){
Node p = new Node (current.info, current.next);
current.info = newNode.info;
current.next = p;
}
else {
last.next = newNode;
last = newNode;
}
System.out.println("Please enter the text you wish to insert, or type \"end\" if you are done inserting.");
theString = console.nextLine();
}
}
修改
整个程序很长,但这里是“setLine”方法,它将当前设置等于用户希望插入其Node的位置。它需要一个参数“int line”,它是通过用户提示获得的。
public Node setLine(int line) {
int index = 0;
current = first;
while (index < line) {
previous = current;
current = current.next;
index++;
}
return current;
}
答案 0 :(得分:1)
这是一个正确插入节点的代码。这应该是一个很好的起点,祝你好运(你可以在这里阅读更多内容:http://www.algolist.net/Data_structures/Singly-linked_list/Insertion)。
public class SinglyLinkedList {
public void addLast(SinglyLinkedListNode newNode) {
if (newNode == null)
return;
else {
newNode.next = null;
if (head == null) {
head = newNode;
tail = newNode;
} else {
tail.next = newNode;
tail = newNode;
}
}
}
public void addFirst(SinglyLinkedListNode newNode) {
if (newNode == null)
return;
else {
if (head == null) {
newNode.next = null;
head = newNode;
tail = newNode;
} else {
newNode.next = head;
head = newNode;
}
}
}
public void insertAfter(SinglyLinkedListNode previous,
SinglyLinkedListNode newNode) {
if (newNode == null)
return;
else {
if (previous == null)
addFirst(newNode);
else if (previous == tail)
addLast(newNode);
else {
SinglyLinkedListNode next = previous.next;
previous.next = newNode;
newNode.next = next;
}
}
}
}
答案 1 :(得分:0)
您可以参考以下方法,根据索引在中间插入节点。
public boolean insertInMiddle(int index, int data){
boolean isInserted = false;
Node node = new Node(data);
Node temp = head;
int i=0;
if(index >= 0 && index <= size()){
isInserted = true;
if(index == 0){
if(head !=null){
node.nextNode = head;
head.prevNode = node;
head = node;
}else{
head = node;
tail=node;
}
}else{
while(i<index){
temp = temp.nextNode;
i++;
}
if(temp == null){
node.nextNode = temp;
node.prevNode = tail;
node.prevNode.nextNode = node;
tail=node;
}else{
node.nextNode = temp;
node.prevNode = temp.prevNode;
temp.prevNode = node;
node.prevNode.nextNode = node;
}
}
}
return isInserted;
}
//Method to get the size
public int size(){
int size = 0;
Node node = head;
if(node !=null){
while (node !=null){
size++;
node = node.nextNode;
}
}
return size;
}