我正在练习使用链接列表节点,并遇到了一个我不知道如何回答的问题。如何删除链表中的最后一个节点。下面的代码适用于所有条目的最后一个节点。最后一个不会被删除。
节点类
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();
}
答案 0 :(得分:4)
while(temp != null){
prev = temp;
temp = temp.getNext();
}
prev.next = null;
试试这个:
答案 1 :(得分:3)
如果您使用双向链接列表,这是最简单的,您的列表会同时知道开始和结束。
然后你可以做这样的事情:
public void removeLastItem(){
this.lastNode = this.lastNode.prev;
}
答案 2 :(得分:2)
这是我用来删除最后一个节点的非常简单的技术。
public void deleteLast() {
Node curr = null;
for (curr = this.first; curr.next.next != null;curr = curr.next) {
}
curr.next = null;
}
答案 3 :(得分:1)
我猜你的最后一个元素while(temp.getNext() != null)
失败了。最后一个元素没有next
元素。因此,最后一个元素不会与传递的字符串进行比较。您应该使用调试器跟踪它。
答案 4 :(得分: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); ...
没有意义,但我会把这个错误留给你。
答案 5 :(得分:1)
nextNode
指针。headOfList
指针指向列表中的第一个节点。headOfList
指针设置为headOfList->nextNode
值。完成。找到了所需的节点。currentNode
指针设置为等于headOfList
指针值。currentNode
节点是最后一个节点。完成。找不到所需的节点。currentNode->nextNode
节点是所需节点,请将currentNode->nextNode
设置为currentNode->nextNode->nextNode
值。完成。找到了所需的节点。由于这是一个单链表,因此无法备份。 因此,您需要指向父节点并检查节点子节点是否是您要删除的节点。会有边界条件。
这是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;
}
答案 6 :(得分:0)
这是我的尝试,假设最后一个节点的下一个变量将始终为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);
}
}
答案 7 :(得分:0)
这可以通过使用Java容器类“LinkedList”以更简单的方式完成。 Java中的LinkedList类实现了Deque(双端队列)接口,该接口支持get / add / remove First / Last方法。一个基本的代码片段如下:
LinkedList<Integer> list = new LinkedList<Integer>();
list.addFirst(1);
list.addLast(2);
System.out.println(list.removeLast());
答案 8 :(得分: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);
}
答案 9 :(得分: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;
}
答案 10 :(得分: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;
}
答案 11 :(得分: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;
}
}
}
答案 12 :(得分: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;
}
答案 13 :(得分: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;
}
}
}
答案 14 :(得分: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;
}