【问题标题】:How do I delete the last occurrence in a circular linked list? (java)如何删除循环链表中的最后一次出现? (爪哇)
【发布时间】:2021-05-19 12:57:28
【问题描述】:

我想创建一个方法来删除循环链表中参数中给定值的最后一次出现。
我试图这样做,这是我的方法:

public void deleteLastOccurence(int value) {
        Element cur = this.head;
        Element prev = null;
        Element tmp = null;
        
        if(this.head == null)
            return;
        
        if(this.rear.data == value) {
            this.head = this.rear = null;
            return;
        }
        
//      while(cur != this.rear) {
            while(cur.next != this.head && cur.next.data != value) {
                prev = cur;
                tmp = cur.next;
//              cur = cur.next;
            }
//          cur = cur.next;
//      }
        prev.next = tmp.next;
    }  

但我不认为我正在删除最后一个匹配项,因为如果我要删除的值就在同一个值旁边怎么办。

【问题讨论】:

  • 循环列表怎么会有 last 出现?您如何确定先到后到的内容?
  • @FedericoklezCulloca - this.head
  • 那么这个方法不能在循环链表中实现?
  • @Parasite 这不是我的意思。我的意思是你需要定义在循环结构中先出现和最后出现的含义。想象一个圆上的任意两点。一个先来后一个是什么意思?
  • @FedericoklezCulloca 后面是头部之前的元素。

标签: java list


【解决方案1】:

将查找节点与删除节点分开。该方法简化为

public void deleteLastOccurrence(int value) {
  Element lastOccurrence = findLastOccurrence(value);
  if (null != lastOccurrence) {
    deleteElement(lastOccurrence);
  }
}

假设循环列表意味着head.prevrearrear.nexthead。要查找最后一次出现,从列表的rear 开始,迭代器指向head。因此,最后一次出现是您遇到的第一个匹配项。

private Element findLastOccurrence(int value) {
  if (isEmpty()) {
    return null;
  }
  Element current = rear;
  do {
    if (current.value == value) {
      return current;
    }
    current = current.prev;
  } while (current != rear);  // we're back at the rear with no match
  return null;
}

isEmpty()deleteElement(Element) 方法留给读者作为练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多