删除链接列表的最后一个节点

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

节点类

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

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

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

尝试这个:

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

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

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

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

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

你需要这样的东西:

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

你过早地停止循环了。

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

删除单链表中的节点

假设

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

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

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

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

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

这个对我有用..

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

这里的逻辑很简单,它与获取最后一个节点相同。 这里很棘手的事情是,当你到达最后一个节点时,你必须记住最后一个节点之前的节点并将其设置为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; } 
 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; }