删除链接列表的最后一个节点
我正在练习使用链接列表节点,并遇到了一个我不知道如何回答的问题。 你如何删除链表中的最后一个节点。 下面的代码适用于所有条目的最后一个节点。 最后一个不会被删除。
节点类
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); ...
没有意义,但我会把这个错误留给你。
删除单链表中的节点
假设
- 列表中的每个节点都有一个
nextNode
指针。 -
headOfList
指针指向列表中的第一个节点。 - 已经在列表中的每个节点的下一个指针是正确的。
- 列表中最后一个节点的下一个指针是一些有意义的值(例如,null)。
实施的步骤
- 如果列表为空,则完成。 找不到所需的节点。
- 如果第一个节点是所需节点,请将
headOfList
指针设置为headOfList->nextNode
值。 完成。 找到所需的节点。 - 将
currentNode
指针设置为等于headOfList
指针值。 - 如果
currentNode
节点是最后一个节点。 完成。 找不到所需的节点。 - 如果
currentNode->nextNode
节点是所需节点,则将currentNode->nextNode
设置为currentNode->nextNode->nextNode
值。 完成。 找到所需的节点。 - 转到第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; }