java实现双向链表的增删改

yizhihongxing

Java语言中实现双向链表的增删改可以通过以下步骤进行。

一、创建双向链表节点类

首先,需要创建一个双向链表节点类,该类包含节点值以及指向前驱节点和后继节点的指针。以下是该类的代码实现。

public class DoublyListNode {
    public int val;
    public DoublyListNode prev;
    public DoublyListNode next;

    public DoublyListNode(int val) {
        this.val = val;
        this.prev = null;
        this.next = null;
    }
}

二、双向链表的插入操作

1.头部插入

头部插入操作比较简单,只需要将新节点的后继指针指向链表的头节点,而原来的头节点的前驱指针指向新节点即可。以下是头部插入的示例代码实现。

public void insertAtHead(int val) {
    DoublyListNode newNode = new DoublyListNode(val);
    if (head == null) {
        tail = newNode;
    } else {
        head.prev = newNode;
    }
    newNode.next = head;
    head = newNode;
}

2.尾部插入

尾部插入操作也比较简单,只需要将新节点的前驱指针指向链表的尾节点,而原来的尾节点的后继指针指向新节点即可。以下是尾部插入的示例代码实现。

public void insertAtTail(int val) {
    DoublyListNode newNode = new DoublyListNode(val);
    if (tail == null) {
        head = newNode;
    } else {
        tail.next = newNode;
    }
    newNode.prev = tail;
    tail = newNode;
}

3.任意位置插入

任意位置插入操作比较复杂,需要先找到要插入位置的前驱节点和后继节点,然后进行指针的修改。以下是任意位置插入的示例代码实现。

public void insertAtPos(int val, int pos) {
    DoublyListNode newNode = new DoublyListNode(val);
    if (pos <= 0) {
        insertAtHead(val);
    } else {
        DoublyListNode curr = head;
        for (int i = 0; i < pos - 1 && curr != null; i++) {
            curr = curr.next;
        }
        if (curr == null) {
            insertAtTail(val);
        } else {
            newNode.prev = curr;
            newNode.next = curr.next;
            curr.next = newNode;
            newNode.next.prev = newNode;
        }
    }
}

三、双向链表的删除操作

1.头部删除

头部删除操作比较简单,只需要将头节点的后继节点的前驱指针指向空,再将头指针指向后继节点即可。以下是头部删除的示例代码实现。

public void deleteAtHead() {
    if (head == null) {
        return;
    }
    head = head.next;
    if (head == null) {
        tail = null;
    } else {
        head.prev = null;
    }
}

2.尾部删除

尾部删除操作也比较简单,只需要将尾节点的前驱节点的后继指针指向空,再将尾指针指向前驱节点即可。以下是尾部删除的示例代码实现。

public void deleteAtTail() {
    if (tail == null) {
        return;
    }
    tail = tail.prev;
    if (tail == null) {
        head = null;
    } else {
        tail.next = null;
    }
}

3.任意位置删除

任意位置删除操作比较复杂,需要先找到要删除的节点,然后进行指针的修改。以下是任意位置删除的示例代码实现。

public void deleteAtPos(int pos) {
    if (pos <= 0) {
        deleteAtHead();
    } else {
        DoublyListNode curr = head;
        for (int i = 0; i < pos && curr != null; i++) {
            curr = curr.next;
        }
        if (curr == null) {
            return;
        }
        if (curr == head) {
            deleteAtHead();
        } else if (curr == tail) {
            deleteAtTail();
        } else {
            curr.prev.next = curr.next;
            curr.next.prev = curr.prev;
        }
    }
}

四、双向链表的修改操作

双向链表的修改操作比较简单,只需要找到要修改的节点,然后修改节点的值即可。以下是修改节点的示例代码实现。

public void modify(int val, int pos) {
    DoublyListNode curr = head;
    for (int i = 0; i < pos && curr != null; i++) {
        curr = curr.next;
    }
    if (curr != null) {
        curr.val = val;
    }
}

五、完整示例代码

public class DoublyList {

    private DoublyListNode head;
    private DoublyListNode tail;

    public DoublyList() {
        head = null;
        tail = null;
    }

    public void insertAtHead(int val) {
        DoublyListNode newNode = new DoublyListNode(val);
        if (head == null) {
            tail = newNode;
        } else {
            head.prev = newNode;
        }
        newNode.next = head;
        head = newNode;
    }

    public void insertAtTail(int val) {
        DoublyListNode newNode = new DoublyListNode(val);
        if (tail == null) {
            head = newNode;
        } else {
            tail.next = newNode;
        }
        newNode.prev = tail;
        tail = newNode;
    }

    public void insertAtPos(int val, int pos) {
        DoublyListNode newNode = new DoublyListNode(val);
        if (pos <= 0) {
            insertAtHead(val);
        } else {
            DoublyListNode curr = head;
            for (int i = 0; i < pos - 1 && curr != null; i++) {
                curr = curr.next;
            }
            if (curr == null) {
                insertAtTail(val);
            } else {
                newNode.prev = curr;
                newNode.next = curr.next;
                curr.next = newNode;
                newNode.next.prev = newNode;
            }
        }
    }

    public void deleteAtHead() {
        if (head == null) {
            return;
        }
        head = head.next;
        if (head == null) {
            tail = null;
        } else {
            head.prev = null;
        }
    }

    public void deleteAtTail() {
        if (tail == null) {
            return;
        }
        tail = tail.prev;
        if (tail == null) {
            head = null;
        } else {
            tail.next = null;
        }
    }

    public void deleteAtPos(int pos) {
        if (pos <= 0) {
            deleteAtHead();
        } else {
            DoublyListNode curr = head;
            for (int i = 0; i < pos && curr != null; i++) {
                curr = curr.next;
            }
            if (curr == null) {
                return;
            }
            if (curr == head) {
                deleteAtHead();
            } else if (curr == tail) {
                deleteAtTail();
            } else {
                curr.prev.next = curr.next;
                curr.next.prev = curr.prev;
            }
        }
    }

    public void modify(int val, int pos) {
        DoublyListNode curr = head;
        for (int i = 0; i < pos && curr != null; i++) {
            curr = curr.next;
        }
        if (curr != null) {
            curr.val = val;
        }
    }

    class DoublyListNode {
        public int val;
        public DoublyListNode prev;
        public DoublyListNode next;

        public DoublyListNode(int val) {
            this.val = val;
            this.prev = null;
            this.next = null;
        }
    }
}

六、示例说明

以下示例代码演示了如何创建一个双向链表实例并进行插入、删除和修改操作。

public static void main(String[] args) {
    DoublyList list = new DoublyList();
    list.insertAtHead(1);
    list.insertAtHead(2);
    list.insertAtTail(3);
    list.insertAtPos(4, 1);
    list.modify(5, 2);
    list.deleteAtHead();
    list.deleteAtTail();
    list.deleteAtPos(1);
}

在这个示例中,首先创建了一个双向链表实例,然后进行了头部插入、尾部插入、任意位置插入、修改、头部删除、尾部删除和任意位置删除操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现双向链表的增删改 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Python3.5面向对象程序设计之类的继承和多态详解

    Python3.5面向对象程序设计之类的继承和多态详解 什么是继承? 继承是面向对象编程的重要特性之一,它允许我们定义一个类,这个类可以生成功能与已存在类相似但又具有独特特性的新类。这个新类被称为子类,它继承了父类的所有方法和属性,也可以添加自己的方法和属性。 在Python中,我们使用关键字”extends”定义一个子类,如下所示: class Child…

    other 2023年6月26日
    00
  • 剖析C++的面向对象编程思想

    剖析C++的面向对象编程思想 1. 什么是面向对象编程(OOP) 面向对象编程是一种常用的编程思想,它将程序的组织方式从代码的角度转移到对象的角度。在面向对象编程中,我们将现实世界中的事物抽象成对象,这些对象具有属性(数据)和行为(方法),并且可以通过相互之间的交互来实现系统功能。 2. C++中的面向对象编程 C++是一种支持面向对象编程的多范式编程语言。…

    other 2023年6月28日
    00
  • linux 中如何修改时间 date

    Linux 中如何修改时间 date date 命令是 Linux 系统中修改当前时间的一个重要工具,系统时间是在 BIOS 中设置的,当运行系统后就会将其初始化到时钟中。 修改时间要求具有 root 权限,而在使用 date 命令来设置时间时,必须按照一定的格式进行输入。下面我们就来详细介绍一下如何在 Linux 中修改系统时间。 系统时间的当前显示 我们…

    其他 2023年3月28日
    00
  • Java中的反射机制基本运用详解

    Java中的反射机制基本运用详解 什么是Java反射机制? Java反射机制指的是Java在运行状态下,可以动态获取类的信息,创建对象,调用对象的方法等操作的能力。它可以在编译期间不知道类的全部信息,在运行时动态获取所需信息,这样可以大大提高代码的灵活性和可扩展性,但同时也会增加代码的复杂度和运行效率。Java中的反射机制主要由以下几个类和接口组成: Cla…

    other 2023年6月27日
    00
  • 关于python:pycharm“运行配置” 要求“脚本参数”

    关于Python: PyCharm“运行配置”要求“脚本参数”的攻略 在使用PyCharm进行Python开发时,我们经常需要在运行Python脚本时传递一些参数。本攻略将详细介绍如何在PyCharm中配置脚本参数,并提供两个示例。 方法1:使用PyCharm的“运行配置”功能 PyCharm提供了一个“运行配置”功能,可以方便地配置Python脚本的运行参…

    other 2023年5月9日
    00
  • C语言中的字符(char)详细讲解

    C语言中的字符(char)详细讲解 什么是字符(char)? 在 C 语言中,数据类型用于声明不同类型的变量或函数。变量的类型决定了变量存储在内存中的大小和存储格式。char 数据类型用于存储字符,它通常是一个字节(8 位)大小的数据类型。 char类型的声明 可以使用关键字 char 来声明一个字符类型的变量。如下所示: char c; 被声明为 char…

    other 2023年6月27日
    00
  • Android编程之点击按钮的响应方式小结【3种方式】

    Android编程之点击按钮的响应方式小结【3种方式】 在Android编程中,我们经常需要为按钮添加点击事件的响应。下面将介绍三种常用的方式来实现按钮的点击响应。 1. 使用匿名内部类 这是最常见的一种方式,通过创建一个匿名内部类来实现按钮的点击事件。 Button button = findViewById(R.id.button); button.se…

    other 2023年9月6日
    00
  • 关于sql:mysql-使用groupby和desc

    关于SQL: MySQL – 使用GROUP BY和DESC 在MySQL中,我们可以使用GROUP BY和DESC关键字来对查询结果进行组和排序。本攻略将详细介绍如何使用GROUP BY和DESC关键字。 问题描述 我们需要对MySQL数据库数据进行分组和排序。具体说,我们需要按照某个列的值进行分组,并按照另一个列的值进行降序。 解方法 要解决“使用GRO…

    other 2023年5月9日
    00
合作推广
合作推广
分享本页
返回顶部