2

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

节点类

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

15 回答 15

5
while(temp != null){
  prev = temp;
  temp = temp.getNext();

}

prev.next = null;

试试这个:

于 2013-04-03T16:33:27.380 回答
4

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

public void deleteLast() {
    Node curr = null;

    for (curr = this.first; curr.next.next != null;curr = curr.next) {

    }

    curr.next = null;
}
于 2015-03-25T11:52:41.583 回答
3

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

然后你可以做这样的事情:

public void removeLastItem(){
    this.lastNode = this.lastNode.prev;
}
于 2013-04-03T16:21:29.870 回答
1

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

于 2013-04-03T16:21:37.193 回答
1

你需要这样的东西:

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); ...没有意义,但我会把那个错误留给你。

于 2013-04-03T16:28:04.403 回答
1

删除单链表中的节点

假设

  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;
    }
于 2013-04-03T16:42:41.243 回答
0

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

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

}
于 2013-10-30T06:54:10.747 回答
0

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

LinkedList<Integer> list = new LinkedList<Integer>();
list.addFirst(1);
list.addLast(2);
System.out.println(list.removeLast());
于 2013-12-06T13:11:30.957 回答
0

这个对我有用..

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);  
}
于 2015-05-16T07:33:03.883 回答
0

这里的逻辑很简单,和获取最后一个节点是一样的。这里的棘手之处在于,当您到达最后一个节点时,您必须记住最后一个节点之前的节点并将其设置为 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;
    }
于 2016-10-16T15:28:42.513 回答
0
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;

}
于 2017-12-29T14:00:14.920 回答
0

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

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

}

于 2019-02-18T17:07:41.147 回答
0
/**
 * 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;
}
于 2019-03-14T15:39:31.707 回答
0

这将工作:)

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;
        }
    }
}
于 2019-08-23T22:56:03.337 回答
0
这更简单,更完美。
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;
}
于 2021-02-13T17:36:45.050 回答