【问题标题】:How to delete a node from a circular linked list in Java?如何从Java中的循环链表中删除一个节点?
【发布时间】:2016-05-18 18:57:40
【问题描述】:

给定一个循环链表,用Java编写一个删除节点的方法。

【问题讨论】:

  • 欢迎来到 StackOverflow!我们不为您编写代码!我们很想帮助你,但如果你不努力,我们也不会。
  • 我正在做一个问答的事情,因为我没有找到我要找的东西。显然我做得不对。

标签: java linked-list circular-list


【解决方案1】:

实际上有四种情况需要考虑。

案例 1:

列表是空的吗?如果是,则返回 null 或返回

案例 2:

列表中只有一个元素。 将指针设置为 null,将列表设置为 null。

案例 3:

删除列表前面的内容。 在这种情况下,我们有几个步骤。

步骤:

  1. 制作一个指向列表的临时指针。
  2. 移至列表末尾。
  3. 将临时指针设置到列表的前面。
  4. 向前移动列表的前面。
  5. 将 temp 的指针设置为 null。
  6. 将列表末尾设置为指向列表的新前面。

案例 4:

删除这种格式的东西 1->2->3-> 我们正在删除中间的项目。 注意。这也适用于删除最后一项,因为它会循环回到 1。

步骤

  1. 制作一个指向列表的临时指针。
  2. 向前移动临时指针,直到我们找到要删除的数据。
  3. 创建一个删除节点(示例节点删除)并将其设置为 temp 的指针。
  4. 设置 temp 以跳过我们正在删除的节点。
  5. 将删除节点的指针设置为空。

    public void delete(int data) {
        // Null list case
        if(list == null) return;
    
        // Delete the only element case
        if(list.data == data && list.next.data == list.data) {
            list.next = null;
            list = null;
            return;
        }
    
        // Delete the front of the list case
        if(list.data == data) {
    
            // Move to the end of the list
            Node end = list;
            while(end.next.data != list.data) {
                end = end.next;
            }
    
            Node temp = list;   
            list = list.next;
            temp.next = null;
            end.next = list;
            return;
        }
    
        // Delete something in the middle
        Node temp = list;
        while(temp.next.data != data && temp.next.data != list.data) {
            temp = temp.next;
        }
    
        // We circled the list and did not find the element to delete       
        if(temp.next.data == list.data) return; 
    
        Node del = temp.next;
        temp.next = temp.next.next;
        del.next = null;
    }   
    

【讨论】:

  • OP 要求提供删除Node 的方法,但在此方法中,您提供了删除内容与int 匹配的节点的方法。这也假设循环链表中只有唯一元素。
  • 那是 OP,我认为他刚刚发布了他的代码
  • 这似乎过于复杂了。你真的关心什么以外的事情——我有没有绕圈子?除此之外,您只是在删除一个节点;没有?
  • 我正在查看人们发布的面试问题,但在堆栈溢出时我没有找到答案,所以我想我会分享。
  • 另外,也许我应该定义Node,但我认为给定循环链表很明显。面试题的标准类型是 Node next 和 int data。空箱、单件箱、前箱、典型箱都要考虑。
猜你喜欢
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
相关资源
最近更新 更多