【问题标题】:Delete Last Node of a Linked List删除链表的最后一个节点
【发布时间】:2013-03-25 10:24:46
【问题描述】:

我正在练习使用链接列表节点,但遇到了一个我不知道如何回答的问题。你如何去删除链表中的最后一个节点。下面的代码适用于最后一个节点的所有条目栏。最后一个不会被删除。

节点类

public class Node {

    private String data;
    private Node next;

    Node(String data, Node next)
    {
        this.data = data;
        this.next = next;
    }

    public void setData(String d)
    {
        data = d;
    }

    public void setNext(Node n)
    {
        next = n;
    }

    public String getData()
    {
        return data;
    }

    public Node getNext()
    {
        return next;
    }

主要

Node list = new Node("NODE 1",new Node("NODE 2",new Node("NODE 3", null)));
        list = insertSecond(list,"New Node");
        list = addLast(list,"LAST NODE");

        printList(list);
        System.out.println();
        deleteNode(list,"LAST NODE");
        printList(list);    
    }

    public static Node deleteNode(Node list,String str)
    {
        Node temp = list;
        Node prev = list;

        while(temp.getNext() != null)
        {
            if(temp.getData().equals(str))
            {
                if(prev.getNext() == null)
                    prev.setNext(null);
                else{
                prev.setNext(prev.getNext().getNext());
                }

            }
            prev = temp;
            temp = temp.getNext();
        }

【问题讨论】:

  • 你试过调试这个吗?
  • prev.getNext() == null 应该是 prev.getNext() != null。您正在检查它是否为 null,然后将其设置为 null。
  • if(prev.getNext() == null) prev.setNext(null); 没有意义
  • 我知道它不对,但是如何将下一个节点的指针设置为空。

标签: java linked-list nodes


【解决方案1】:
while(temp != null){
  prev = temp;
  temp = temp.getNext();

}

prev.next = null;

试试这个:

【讨论】:

    【解决方案2】:

    这是我用来删除最后一个节点的非常简单的技术。

    public void deleteLast() {
        Node curr = null;
    
        for (curr = this.first; curr.next.next != null;curr = curr.next) {
    
        }
    
        curr.next = null;
    }
    

    【讨论】:

      【解决方案3】:

      如果你使用双向链表是最简单的,你的列表知道开始和结束。

      然后你可以这样做:

      public void removeLastItem(){
          this.lastNode = this.lastNode.prev;
      }
      

      【讨论】:

        【解决方案4】:

        我猜while(temp.getNext() != null) 你的最后一个元素会失败。最后一个元素没有next 元素。所以最后一个元素不会与传递的字符串进行比较。您应该使用调试器对此进行跟踪。

        【讨论】:

          【解决方案5】:

          你需要这样的东西:

          public static Node deleteNode(Node list, String str) {
            Node temp = list;
            Node prev = list;
          
            do {
              if (temp.getData().equals(str)) {
                if (prev.getNext() == null) {
                  prev.setNext(null);
                } else {
                  prev.setNext(prev.getNext().getNext());
                }
              }
              prev = temp;
              temp = temp.getNext();
            } while (temp != null);
          
            return list;
          }
          

          您过早停止循环。

          顺便说一句:if (prev.getNext() == null) { prev.setNext(null); ... 没有意义,但我会把这个错误留给你。

          【讨论】:

          • 你对 if (prev.getNext() == null) { prev.setNext(null).对此感到非常愚蠢。但是 do - while 循环是必要的。它适用于常规的 while 循环。只是想确保我没有遗漏任何东西。
          • @Calgar99 - 你可以使用任何你喜欢的循环形式,只要你 a) 访问每个节点 b) 正确处理头、尾、空列表和单项列表。有时值得尝试使用do 循环来实现a)。
          • 感谢您抽出宝贵时间提供帮助
          【解决方案6】:

          删除单链表中的节点

          假设

          1. 列表中的每个节点都有一个nextNode 指针。
          2. headOfList 指针指向列表中的第一个节点。
          3. 已经在列表中的每个节点的下一个指针是正确的。
          4. 列表中最后一个节点的下一个指针是一些有意义的值(例如,null)。

          实施步骤

          1. 如果列表为空,则完成。未找到所需节点。
          2. 如果第一个节点是所需节点,请将headOfList 指针设置为headOfList->nextNode 值。完毕。找到所需的节点。
          3. 将currentNode 指针设置为等于headOfList 指针值。
          4. 如果currentNode 节点是最后一个节点。完毕。未找到所需节点。
          5. 如果currentNode->nextNode 节点是所需节点,请将currentNode->nextNode 设置为currentNode->nextNode->nextNode 值。完毕。找到所需的节点。
          6. 转到第 4 步。

          注意事项

          由于这是一个单链表,不能备份。 因此,您需要指向节点父节点并检查节点子节点是否是您要删除的节点。会有边界条件。

          一些代码

          这是 LinkedList 类的成员函数。 startOfList 是类成员,指向链表的开头。

           public boolean delete(final String target)
              {
                  if (startOfList != null)
                  {
                      if (StringUtils.equals(startOfList.getData(), target))
                      {
                          startOfList = startOfList.getNext();
                          return true;
                      }
          
                      Node current = startOfList;
          
                      for (Node next = current.getNext(); next != null; next = current.getNext())
                      {
                          if (StringUtils.equals(next.getData(), target))
                          {
                              current.setNext(next.getNext());
                              return true;
                          }
                          else // advance one node.
                          {
                              current = next;
                          }
                      }
                  }
          
                  return false;
              }

          【讨论】:

          • 设置headOfList-> nextNode的合适方法是什么。我正在尝试这个但没有用。if(temp.getData().equals(str)) { if(temp.getData().equals(list.getData())) { temp.setNext(temp.getNext() ); } else { prev.setNext(prev.getNext().getNext()); } }
          • 进入循环前删除节点。这是一个边界条件。
          • 你知道合适的语法是什么吗?抱歉,我尝试了多种方法,但得到了相同的结果。
          【解决方案7】:

          这是我的尝试,假设最后一个节点的下一个变量将始终为空:

          public class LastNodeRemoval {
          
            private static class Node {
                String item;
                Node next;
            }
          
            public static void main(String[] args) {
                Node third = new Node();
                third.item = "Third";
          
                Node second = new Node();
                second.item = "Second";
                second.next = third;
          
                Node first = new Node();
                first.item = "First";
                first.next = second;
          
                removalLastNode(first);
             }
          
             private static void removalLastNode(Node first) {
                Node temp = first;
          
                while(temp.next.next != null) {
                    temp = temp.next;
                }
          
                temp.next = null;
          
                System.out.println("Last node: "+temp.item);
             }
          
          }
          

          【讨论】:

          • 如果列表包含 1 个元素,那么 temp.next.next 将不引用任何内容,它会崩溃
          【解决方案8】:

          这可以通过使用 Java 容器类“LinkedList”以更简单的方式完成。 Java 中的 LinkedList 类实现了支持 get/add/remove First/Last 方法的 Deque(双端队列)接口。基本代码 sn-p 如下:

          LinkedList<Integer> list = new LinkedList<Integer>();
          list.addFirst(1);
          list.addLast(2);
          System.out.println(list.removeLast());
          

          【讨论】:

            【解决方案9】:

            这个对我有用..

            public void removeLastNode(){
                System.out.println("\n Inside removeLastNode");
                next=firstLink;
                prev=firstLink;
                if(next == null) System.out.println("\n The link List is Empty");
                while(next.getNext()!=null) { 
                    prev=next;
                    next=next.getNext();
                }
                prev.setNext(null);  
            }
            

            【讨论】:

              【解决方案10】:

              这里的逻辑很简单,和获取最后一个节点是一样的。 这里的棘手之处在于,当您到达最后一个节点时,您必须记住 在最后一个节点之前的节点并将其设置为 null,以便它将成为新的最后一个节点。在下面的代码中,当您到达最后一个元素 n2 时,获取 n1 并将其设置为 null。

              public void removeLast(){
                  if(head==null) System.out.println("List is empty");
                  else {
                  Node n1 = null;
                  Node n2 = head;
                      while(n2.next != null)
                      {
                          n1 = n2;
                          n2 = n2.next;
                      }
                      n1.next = null;
                  }
              

              【讨论】:

                【解决方案11】:
                public  Node deleteEnd(Node node)
                
                {
                
                if(node==null)
                
                {
                
                  throw new IllegalStateException();
                
                }
                
                    if(node.getNext()==null)
                    return null;
                
                    Node headF=node;
                
                    while (node.getNext().getNext()!=null)
                    {
                        node=node.getNext();
                    }
                    node.setNext(null);
                    return headF;
                
                }
                

                【讨论】:

                  【解决方案12】:

                  鉴于以下单链表实现,可以使用从first 节点开始遍历列表的removeLast() 或removeLastRecursive() 方法删除最后一个节点:

                  public class LinkedList<T> {
                      Node<T> first;
                      Node<T> last;
                      int length;
                  
                      public LinkedList() {
                  
                      }
                  
                      public static void main(String[] args) {
                          LinkedList<String> linkedList = new LinkedList();
                          linkedList.add("A");
                          linkedList.add("B");
                          linkedList.add("C");
                          linkedList.add("D");
                  
                          linkedList.printListParams();
                          linkedList.removeLast();
                          linkedList.printListParams();
                          linkedList.removeLast();
                          linkedList.printListParams();
                          linkedList.removeLast();
                          linkedList.printListParams();
                          linkedList.removeLast();
                          linkedList.printListParams();
                          linkedList.removeLast();
                          linkedList.printListParams();
                      }
                  
                      public void add(T data) {
                          if (isEmpty()) {
                              first = new Node(data);
                              last = first;
                          } else {
                              last.next = new Node(data);
                              last = last.next;
                          }
                          length++;
                      }
                  
                      public void removeLast() {
                          Node current = first;
                          if (isEmpty()) return;
                          if (current.next != null) {
                              while (current.next != null) {
                                  if (current.next.next == null) {
                                      current.next = null;
                                      last = current;
                                      length--;
                                      return;
                                  }
                                  current = current.next;
                              }
                          } else {
                              first = null;
                              last = null;
                              length--;
                          }
                      }
                  
                      public void removeLastRecursive() {
                          if (isEmpty()) return;
                          if (first.next != null) {
                              removeLast(first);
                          } else {
                              first = null;
                              last = null;
                              length--;
                          }
                      }
                  
                      private void removeLast(Node node) {
                          if (node.next.next != null) {
                              removeLast(node.next);
                          } else {
                              node.next = null;
                              last = node;
                              length--;
                              return;
                          }
                      }
                  
                      public boolean isEmpty() {
                          return first == null;
                      }
                  
                      public void printList() {
                          Node current = first;
                          while (current != null) {
                              System.out.print(current.data);
                              current = current.next;
                          }
                          System.out.println();
                      }
                  
                      public void printListParams() {
                          printList();
                          System.out.println("Length: " + length);
                          System.out.println("Last node data: " + ((last != null) ? last.data : last));
                          System.out.println("***********************");
                      }
                  
                      private class Node<T> {
                          T data;
                          Node next;
                  
                          public Node(T data) {
                              this.data = data;
                          }
                      }
                  
                  }
                  
                  

                  【讨论】:

                    【解决方案13】:
                    /**
                     * Deletion From End
                     */
                    public static LinkedList DeletionFromEnd(LinkedList list){
                        Node currNode = list.head;
                        Node prevNode = null;
                    
                        while( currNode.getNext() != null) {
                            prevNode = currNode;
                            currNode = currNode.getNext();
                        }
                        prevNode.setNext(null);
                    
                        return list;
                    }
                    

                    【讨论】:

                      【解决方案14】:

                      这将工作:)

                      public void deleteFromLast()
                      {   Node secondLastNode=null;
                          Node currentNode=first;
                          while(currentNode.next!=null)
                          {   secondLastNode=currentNode;
                              currentNode=currentNode.next;
                              if(currentNode.next==null)
                              {
                                  secondLastNode.next=null;;
                                  break;
                              }
                          }
                      }
                      

                      【讨论】:

                        【解决方案15】:
                        这样更简单,效果更佳。
                        public void deleteLastNode() {
                            Node curr = head;
                            Node prevNode = null;
                            if(head == null) return;
                            while(curr != null && curr.next != null) {
                                prevNode = curr;
                                curr = curr.next;
                            }
                            if(head.next != null) prevNode.next = null;
                            else head = null;
                        }
                        

                        【讨论】:

                          猜你喜欢
                          • 2016-06-11
                          • 2014-05-22
                          • 1970-01-01
                          • 2019-06-08
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多