【问题标题】:Add to front of linked list添加到链表的前面
【发布时间】:2011-06-20 10:49:39
【问题描述】:

我对如何添加到链表的前面感到困惑。

/**
* 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 类。

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

【问题讨论】:

  • 这如何产生循环?
  • 这不会产生循环。当您尝试编译代码时,您愿意提供编译器生成的错误吗?

标签: java linked-list


【解决方案1】:

您无法访问“下一个”节点吗?

这样的话

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 构造函数将 next 指针作为其第二个参数,在这种情况下,我看不出这段代码有任何明显的错误。这听起来真的像一个家庭作业问题。如果是,你应该这样标记它。

    【讨论】:

    • 如果你能说出循环发生在哪里会很有帮助。什么指向什么?您的 Node 构造函数中是否存在错误?
    【解决方案3】:

    以我有限的链表知识,我会冒险这样做:

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

    不过,您可能想等待某人确认。

    【讨论】:

    • 我同意@takteek,如果第二个参数指向下一个节点,它看起来确实正确。
    • 也试过了。它仍然会创建一个循环。
    • 如果第二个参数是指向下一个节点的指针,我看不出这个 insert 方法的实现有什么问题。您确定这是导致循环而不是其他原因吗?
    • 你不需要最后一个参数。
    【解决方案4】:

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

    如果没有链表实现的其余代码,无法确定,但您提供的代码看起来根本不会创建循环。

    如果正在创建一个循环,它很可能是在其他地方创建的。或者,您/您的测试误诊为由循环引起的其他故障。

    如果您需要更多帮助,请发布更多代码/证据……尤其是 Node 构造函数,以及让您认为自己有循环的代码。

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        这是我在 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();
        }
        

        【讨论】:

          【解决方案7】:

          一个简单快速的[可能效率不高]的解决方案是用新元素创建一个临时的新LinkedList,并将两个列表与前面的临时列表合并在一起。 看下面的例子

          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);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2015-06-01
            • 2016-03-26
            • 1970-01-01
            • 2016-09-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-16
            • 1970-01-01
            相关资源
            最近更新 更多