博客
关于我
Java实现无头双向链表
阅读量:528 次
发布时间:2019-03-08

本文共 9166 字,大约阅读时间需要 30 分钟。

创建空的成员变量并用构造函数初始化

class ListNode {       public int data;    public ListNode next;//节点引用    public ListNode prev;//节点前驱    public ListNode(int data) {           this.data = data;    }}

头节点和尾结点

public class DoubleLinkedList {       public ListNode head;    public ListNode tail;

头插法

//头插法    public void addFirst(int data) {           ListNode node = new ListNode(data);        if (this.head == null) {               this.head = node;            this.tail = node;        } else {               node.next = this.head;            this.head.prev = node;            this.head = node;        }    }

在这里插入图片描述头插法的过程如代码和图所示,分为如果链表还没有头节点和以及有头节点,插入顺序不再赘述。

尾插法

//尾插法    public void addLast(int data) {           ListNode node = new ListNode(data);        if (this.head == null) {               this.tail = node;            this.head = node;        } else {               this.tail.next = node;            node.prev = this.tail;            this.tail = node;        }    }

在这里插入图片描述

打印链表

//打印链表    public void display() {           ListNode cur = this.head;        while (cur != null) {               System.out.print(cur.data + " ");            cur = cur.next;        }        System.out.println();    }

任意位置插入,第一个数据节点为0的下标

计算链表长度

//任意位置插入,第一个数据节点为0的下标    public void addIndex (int index,int data) {           if (index < 0 || index > size()) {               return;        }        if (index == 0) {               addFirst(data);            return;        }        if (index == size()) {               addLast(data);            return;        }        ListNode cur = searchIndex(index);        ListNode node = new ListNode(data);        node.next = cur;        node.prev = cur.prev;        cur.prev.next = node;        cur.prev = node;    }    public ListNode searchIndex(int index) {           ListNode cur = this.head;        while (index > 0) {               cur = cur.next;            index --;        }        return cur;    }    //求链表长度    public int size() {           ListNode cur = this.head;        int count = 0;        while (cur != null) {               cur = cur.next;            count++;        }        return count;    }

在这里插入图片描述

删除第一次出现关键字为key的点

//删除第一次出现关键字为key的点    public void remove(int key) {           ListNode cur = this.head;        while (cur != null) {               if (cur.data == key) {                   //删除的是否为头节点                if (cur == this.head) {                       this.head = this.head.next;                    this.head.prev = null;                } else {                       cur.prev.next = cur.next;                    if (cur.next != null) {                           //删除的不是尾结点                        cur.next.prev = cur.prev;                    } else {                           this.tail = cur.prev;                    }                }                //删除完成                return;            } else {                   cur = cur.next;            }        }    }

删除所有key节点

public void removeAllkey (int key) {           ListNode cur = this.head;        while (cur != null) {               if (cur.data == key) {                   //删除的是否为头节点                if (cur == this.head) {                       this.head = this.head.next;                    this.head.prev = null;                } else {                       cur.prev.next = cur.next;                    if (cur.next != null) {                           //删除的不是尾结点                        cur.next.prev = cur.prev;                    } else {                           this.tail = cur.prev;                    }                }            }            cur = cur.next;        }    }

清空链表

//清空回收链表    public void clear() {           ListNode cur = this.head;        ListNode curNext;        while (cur != null) {               curNext = cur.next;            cur.next = null;            cur.prev = null;            cur = curNext;        }        this.head = null;        this.tail = null;    }

查找是否含有关键字key

//查找是否包含关键字key    public boolean contains (int key) {           if (head == null) {               return false;        }        ListNode cur = this.head;        while (cur != null) {               if (cur.data == key) {                   return true;            }            cur = cur.next;        }        return false;    }}

测试代码

public class Test {       public static void main(String[] args) {           DoubleLinkedList doubleLinkedList = new DoubleLinkedList();        doubleLinkedList.addFirst(3);        doubleLinkedList.addFirst(3);        doubleLinkedList.addFirst(3);        doubleLinkedList.addLast(4);        doubleLinkedList.addLast(5);        doubleLinkedList.addLast(3);        //3 2 1 4 5 6        doubleLinkedList.display();        doubleLinkedList.addIndex(3,999);        //3 2 1 999 4 5 6        doubleLinkedList.display();        doubleLinkedList.remove(5);        doubleLinkedList.display();        System.out.println(doubleLinkedList.contains(9));        doubleLinkedList.removeAllkey(3);        doubleLinkedList.display();        doubleLinkedList.clear();        System.out.println("dadedsffw");    }}

完整代码

import java.util.List;/** * @Author 袁媛 * @Date 2020/7/31 * @Time 10:54 */class ListNode {       public int data;    public ListNode next;    public ListNode prev;    public ListNode(int data) {           this.data = data;    }}public class DoubleLinkedList {       public ListNode head;    public ListNode tail;    //头插法    public void addFirst(int data) {           ListNode node = new ListNode(data);        if (this.head == null) {               this.head = node;            this.tail = node;        } else {               node.next = this.head;            this.head.prev = node;            this.head = node;        }    }    //尾插法    public void addLast(int data) {           ListNode node = new ListNode(data);        if (this.head == null) {               this.tail = node;            this.head = node;        } else {               this.tail.next = node;            node.prev = this.tail;            this.tail = node;        }    }    //打印链表    public void display() {           ListNode cur = this.head;        while (cur != null) {               System.out.print(cur.data + " ");            cur = cur.next;        }        System.out.println();    }    //任意位置插入,第一个数据节点为0的下标    public void addIndex (int index,int data) {           if (index < 0 || index > size()) {               return;        }        if (index == 0) {               addFirst(data);            return;        }        if (index == size()) {               addLast(data);            return;        }        ListNode cur = searchIndex(index);        ListNode node = new ListNode(data);        node.next = cur;        node.prev = cur.prev;        cur.prev.next = node;        cur.prev = node;    }    public ListNode searchIndex(int index) {           ListNode cur = this.head;        while (index > 0) {               cur = cur.next;            index --;        }        return cur;    }    //求链表长度    public int size() {           ListNode cur = this.head;        int count = 0;        while (cur != null) {               cur = cur.next;            count++;        }        return count;    }    //删除第一次出现关键字为key的点    public void remove(int key) {           ListNode cur = this.head;        while (cur != null) {               if (cur.data == key) {                   //删除的是否为头节点                if (cur == this.head) {                       this.head = this.head.next;                    this.head.prev = null;                } else {                       cur.prev.next = cur.next;                    if (cur.next != null) {                           //删除的不是尾结点                        cur.next.prev = cur.prev;                    } else {                           this.tail = cur.prev;                    }                }                //删除完成                return;            } else {                   cur = cur.next;            }        }    }    //删除所有key节点    public void removeAllkey (int key) {           ListNode cur = this.head;        while (cur != null) {               if (cur.data == key) {                   //删除的是否为头节点                if (cur == this.head) {                       this.head = this.head.next;                    this.head.prev = null;                } else {                       cur.prev.next = cur.next;                    if (cur.next != null) {                           //删除的不是尾结点                        cur.next.prev = cur.prev;                    } else {                           this.tail = cur.prev;                    }                }            }            cur = cur.next;        }    }    //清空回收链表    public void clear() {           ListNode cur = this.head;        ListNode curNext;        while (cur != null) {               curNext = cur.next;            cur.next = null;            cur.prev = null;            cur = curNext;        }        this.head = null;        this.tail = null;    }    //查找是否包含关键字key    public boolean contains (int key) {           if (head == null) {               return false;        }        ListNode cur = this.head;        while (cur != null) {               if (cur.data == key) {                   return true;            }            cur = cur.next;        }        return false;    }}

转载地址:http://coanz.baihongyu.com/

你可能感兴趣的文章
Mysql学习总结(68)——MYSQL统计每天、每周、每月、每年数据 SQL 总结
查看>>
Mysql学习总结(69)——Mysql EXPLAIN 命令使用总结
查看>>
Mysql学习总结(6)——MySql之ALTER命令用法详细解读
查看>>
Mysql学习总结(70)——MySQL 优化实施方案
查看>>
Mysql学习总结(71)——MySQL 重复记录查询与删除总结
查看>>
Mysql学习总结(71)——数据库介绍(MySQL安装 体系结构、基本管理)再回顾
查看>>
Mysql学习总结(73)——MySQL 查询A表存在B表不存在的数据SQL总结
查看>>
Mysql学习总结(76)——MySQL执行计划(explain)结果含义总结
查看>>
Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
查看>>
Mysql学习总结(78)——MySQL各版本差异整理
查看>>
Mysql学习总结(79)——MySQL常用函数总结
查看>>
Mysql学习总结(7)——MySql索引原理与使用大全
查看>>
Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
查看>>
Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
查看>>
Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
查看>>
Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
查看>>
Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
查看>>
Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
查看>>
Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
查看>>
Mysql学习总结(9)——MySql视图原理讲解与使用大全
查看>>