在链表头部添加元素

6
我很困惑如何在链表的前面添加元素。
/**
* data is added to the front of the list
* @modifies this
* @ffects 2-->4-->6 becomes data-->2-->4-->6
*/
public void insert(E data) {
    if (front == null) 
        front = new Node(data, null);
    else {
        Node temp = new Node(data, front);
        front = temp;
    }
}

这会创建一个循环。我该如何避免这种情况?

我有一个LinkedList类,它在一个名为front的变量中保存了前置节点。 在这个LinkedList类内部有一个Node类。

任何帮助都将不胜感激。 谢谢。


1
这会创建一个循环吗? - Avi
1
这不会创建一个循环。 您能否提供编译器在尝试编译代码时生成的错误? - Varun Madiath
7个回答

8

你无法访问“Next”节点吗?

如果是这种情况

public void insert(E data) {
    if (front == null) { 
        front = new Node(data, null);
    } else {
        Node temp = new Node(data, null);
        temp.next = front;
        front = temp;
    }
}

--

 class LinkedList {
    Node front;

    LinkedList() { 
        front = null; 
    }

    public void AddToFront(String v) {
        if (front == null) {
            front = new Node(v);
        } else {
            Node n = new Node(v);
            n.next = front;
            front = n;
        }
    }   
}

class Node {
    public Node next;
    private String _val;

    public Node(String val) {
        _val = val;
    }
}

2

根据我有限的链表知识,我会尝试提供以下建议:

Node temp = new Node(data);
temp.next = front;
front = temp;

你可能想等待某人确认。

我同意@takteek的观点,如果第二个参数是下一个节点,则看起来是正确的。 - user183037
也尝试过那个方法,但仍然会创建一个循环。 - Catie
如果第二个参数是指向下一个节点的指针,我认为这个插入方法的实现没有任何问题。你确定这是导致循环的原因而不是其他什么吗? - user183037
你不需要最后一个参数。 - BilalReffas

2

我假设Node构造函数将其第二个参数作为下一个指针,那么我没有看到这段代码中明显的错误。这似乎是一道作业题。如果是的话,你应该加上相应的标签。


如果您能说明循环发生的位置,将会很有帮助。什么指向了什么?您的节点构造函数是否存在错误? - takteek

1
这会创建一个循环。我怎样才能避免这个问题呢?
没有你所提供的链表实现的其他代码,我们无法确定是否会产生循环。但是从你提供的代码来看,并没有创建循环的迹象。
如果确实存在循环,那很可能是在其他地方创建的。或者,你/你的测试错误地将其他故障诊断为循环引起的故障。
如果需要更多帮助,请发布更多代码/证据...特别是节点构造函数和让你认为存在循环的代码。

0

添加一个新节点,如果当前头节点不为空,则将当前头节点指向新创建的节点作为下一个节点。

Node insert(Node head,int x) {
    Node node = new Node();
    node.data = x;
    if(head != null) {
       node.next = head;}
    return node;
}

0

这是我在Java中实现将节点插入到链表前端或头部的方法。

void insertAtHead(Object data){
    if(head==null) {
        head = new Node(data);
    }
    Node tempNode = new Node(data);
    Node currentNode = head;
    tempNode.setNext(currentNode.getNext());
    head.setNext(tempNode);
    incrementCounter();
}

0
一个简单而快速的[可能不是最有效的]解决方案是创建一个临时的新LinkedList,将新元素插入其中,并将两个列表与temp-list合并在一起。请参见下面的示例。
import java.util.*;
public class Main
{

    public static Queue<Integer> addFirst(Queue<Integer> intQueue, Integer i){
        Queue<Integer> intQueue2 =  new LinkedList<Integer>();
        intQueue2.add(i);
        intQueue2.addAll(intQueue);
        intQueue = intQueue2;
        return intQueue;
    }

    public static void main(String[] args) {
        System.out.println("Hello LinkedList");

        Queue<Integer> intQueue =  new LinkedList<Integer>();
        intQueue.add(3);
        intQueue.add(4);
        intQueue.add(5);

        intQueue = addFirst(intQueue,2);
        intQueue = addFirst(intQueue,1);


        System.out.println(intQueue);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接