java数据结构与算法:双链表 LinkedList

这篇具有很好参考价值的文章主要介绍了java数据结构与算法:双链表 LinkedList。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

双链表 LinkedList

实现代码

package com.lhs;

public class LinkedList<E> implements List<E>{
    // 定义链表长度
    private int size;

    // 定义头节点
    private Node<E> first;

    // 定义尾节点
    private Node<E> last;

    // 内部类,定义节点
    public static class Node<E>{
        // 定义节点数据
        E data;
        // 定义下一个节点
        Node<E> next;

        // 定义前一个节点
        Node<E> pre;

        // 构造函数,用于创建新的节点
        Node(E data,Node<E> next,Node<E> pre){
            this.data = data;
            this.next = next;
            this.pre = pre;
        }
    }

    // 重写size方法,返回链表长度
    @Override
    public int size() {
        return size;
    }

    // 重写isEmpty方法,判断链表是否为空
    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    // 重写contains方法,判断链表是否包含某元素
    @Override
    public boolean contains(Object o) {
        return IndexOf(o) >= 0;
    }

    // 重写IndexOf方法,返回某元素在链表中的位置
    public int IndexOf(Object o){
        Node<E> node = first;
        if (o == null){
            for (int i = 0; i < size; i++) {
                if (node.data == null){
                    return i;
                }
                node = node.next;
            }
            return -1;
        }else{
            for (int i = 0; i < size; i++) {
                if (o.equals(node.data)){
                    return i;
                }
                node = node.next;
            }
            return -1;
        }
    }

    // 重写add方法,向链表末尾添加元素
    @Override
    public boolean add(E e) {
        if (size == 0){
            Node<E> node = new Node<>(e, null, null);
            first = node;
            last = node;
        }else{
            Node<E> l = last;
            Node<E> node = new Node<>(e, null, l);
            l.next = node;
            last = node;
        }
        size++;
        return true;
    }

    // 重写get方法,返回链表中指定位置的元素
    @Override
    public E get(int index) {
        if(index >= size){
            throw new IndexOutOfBoundsException(index + " out of bound");
        }
        Node<E> node;
        if(index > (size >> 1)){
            node = last;
            for(int i = 0 ; i<size - index - 1;i++){
                node = node.pre;
            }
        }else{
            node = first;
            for (int i = 0; i < size - index - 1; i++) {
                node = node.next;
            }
        }
        return node.data;
    }

    // 重写set方法,替换链表中指定位置的元素
    @Override
    public E set(int index, E e) {
        if(index >= size){
            throw new IndexOutOfBoundsException(index + " out of bound");
        }
        E oldVal;
        Node<E> node;
        if(index > (size >> 1)){
            node = last;
            for(int i = 0 ; i<size - index - 1;i++){
                node = node.pre;
            }
        }else{
            node = first;
            for (int i = 0; i < size - index - 1; i++) {
                node = node.next;
            }
        }
        oldVal = node.data;
        node .data = e;
        return oldVal;
    }

    // 重写remove方法,移除链表中指定位置的元素
    @Override
    public E remove(int index) {
        if(index >= size){
            throw new IndexOutOfBoundsException(index + " out of bound");
        }
        Node<E> node;
        if(index > (size >> 1)){
            node = last;
            for(int i = 0 ; i<size - index - 1;i++){
                node = node.pre;
            }
        }else{
            node = first;
            for (int i = 0; i < size - index - 1; i++) {
                node = node.next;
            }
        }
        E oldVal = node.data;
        Node<E> n = node.next;
        Node<E> p = node.pre;
        if(p != null){
            p.next = n;
        }else{
            first = n;
        }
        if(n != null){
            n.pre = p;
        }else{
            last = p;
        }
        size--;
        return oldVal;
    }

    // 重写addFirst方法,向链表头部添加元素
    @Override
    public void addFirst(E e) {
        Node<E> f = first;
        Node<E> node = new Node<>(e, null, f);
        f.pre = node;
        first = node;
        size++;
    }

    // 重写addLast方法,向链表尾部添加元素
    @Override
    public void addLast(E e) {
        add(e);
    }

    // 重写removeFirst方法,移除链表头部元素
    @Override
    public E removeFirst() {
        return remove(0);
    }

    // 重写removeLast方法,移除链表尾部元素
    @Override
    public E removeLast() {
        return remove(size-1);
    }
}

测试代码

/**
 * Welcome to https://waylau.com
 */
package com.lhs;

import org.junit.Test;

import java.util.LinkedList;
import java.util.List;

import static junit.framework.TestCase.*;
import static org.junit.Assert.assertThrows;

/**
 * LinkedList Test.
 * 
 * @since 1.0.0 2020年5月4日
 * @author <a href="https://waylau.com">Way Lau</a>
 */
public class LinkedListTests {

    @Test
    public void testSize() {
       // 实例化LinkedList
       List<String> list = new LinkedList<String>();
       assertTrue(list.size() == 0);

       list.add("Java");
       assertTrue(list.size() == 1);
    }

    @Test
    public void testIsEmpty() {
       // 实例化LinkedList
       List<String> list = new LinkedList<String>();
       assertTrue(list.isEmpty());

       list.add("Java");
       assertFalse(list.isEmpty());
    }

    @Test
    public void testContains() {
       // 实例化LinkedList
       List<String> list = new LinkedList<String>();
       list.add("Java");
       list.add("C++");
       list.add("C");
       list.add("Python");
       list.add("TypeScript");

       // 判断存在
       assertTrue(list.contains("Java"));

       // 判断不存在
       assertFalse(list.contains("Java++"));
    }

    @Test
    public void testAdd() {
       // 实例化LinkedList
       List<Integer> list = new LinkedList<Integer>();
       list.add(1);
       list.add(2);
       list.add(3);
       list.add(4);
       list.add(5);

       assertFalse(list.isEmpty());
    }

    @Test
    public void testGet() {
       // 实例化LinkedList
       List<String> list = new LinkedList<String>();
       list.add("Java");
       list.add("C++");
       list.add("C");

       // 判断存在
       assertEquals("C++", list.get(1));

       // 判断不存在
       int index = 6;
       Throwable excpetion = assertThrows(
             IndexOutOfBoundsException.class, () -> {
                list.get(index);// 抛异常
             });

       assertNotNull(excpetion.getMessage());
    }

    @Test
    public void testSet() {
       // 实例化LinkedList
       List<String> list = new LinkedList<String>();
       list.add("Java");
       list.add("C++");
       list.add("C");

       // 判断存在
       assertEquals("C", list.set(2, "Python"));

       // 判断不存在
       int index = 6;
       Throwable excpetion = assertThrows(
             IndexOutOfBoundsException.class, () -> {
                list.set(index, "Python");// 抛异常
             });

       assertNotNull(excpetion.getMessage());
    }

    @Test
    public void testRemove() {
       // 实例化LinkedList
       List<String> list = new LinkedList<String>();
       list.add("Java");
       list.add("C++");
       list.add("C");

       // 判断存在
       assertEquals("C", list.remove(2));
       assertEquals("C++", list.remove(1));

       assertEquals("Java", list.get(0));

       // 判断不存在
       int index = 6;
       Throwable excpetion = assertThrows(
             IndexOutOfBoundsException.class, () -> {
                list.remove(index); // 抛异常
             });

       assertNotNull(excpetion.getMessage());
    }

    @Test
    public void testAddFirst() {
       // 实例化LinkedList
       LinkedList<String> list = new LinkedList<String>();
       list.addFirst("Java");
       list.addFirst("C++");
       list.addFirst("C");

       // 判断存在
       assertEquals("C", list.get(0));
       assertEquals("C++", list.get(1));
       assertEquals("Java", list.get(2));
    }

    @Test
    public void testAddLast() {
       // 实例化LinkedList
       LinkedList<String> list = new LinkedList<String>();
       list.addLast("Java");
       list.addLast("C++");
       list.addLast("C");

       // 判断存在
       assertEquals("Java", list.get(0));
       assertEquals("C++", list.get(1));
       assertEquals("C", list.get(2));
    }

    @Test
    public void testRemoveFirst() {
       // 实例化LinkedList
       LinkedList<String> list = new LinkedList<String>();
       list.add("Java");
       list.add("C++");
       list.add("C");

       // 判断存在
       assertEquals("Java", list.removeFirst());
       assertEquals("C++", list.removeFirst());
       assertEquals("C", list.removeFirst());
    }

    @Test
    public void testRemoveLast() {
       // 实例化LinkedList
       LinkedList<String> list = new LinkedList<String>();
       list.add("Java");
       list.add("C++");
       list.add("C");

       // 判断存在
       assertEquals("C", list.removeLast());
       assertEquals("C++", list.removeLast());
       assertEquals("Java", list.removeLast());
    }

}

java数据结构与算法:双链表 LinkedList,算法,java,开发语言,数据结构,算法文章来源地址https://www.toymoban.com/news/detail-806702.html

到了这里,关于java数据结构与算法:双链表 LinkedList的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 【数据结构】 LinkedList【神装】

      登神长阶 第二神装    LinkedList   目录 🕶️一.LinkedList 🥼1.简介  🦺2.LinkedList具体使用 👔2.1.构造方法 👕2.2.常见操作 👘2.3.遍历 🧢三.LinkedList的优缺点 与ArrayList的比较 🪖四.总结与反思 在集合框架中,LinkedList是一个普通的类,实现了List接口,具体框架图如下: 说明

    2024年04月14日
    浏览(31)
  • Java 数据结构篇-实现双链表的核心API

    🔥博客主页:  小扳_-CSDN博客 ❤感谢大家点赞👍收藏⭐评论✍       文章目录         1.0 双链表的说明         1.1 双链表 - 创建         1.2 双链表 - 根据索引查找节点         1.3 双链表 - 根据索引插入节点         1.4 双链表 - 头插节点         1.5 双链表 - 尾插

    2024年02月04日
    浏览(39)
  • Java 中数据结构LinkedList的用法

    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。 链表可分为单向链表和双向链表。 一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。 一个双向链表有三个整

    2024年02月11日
    浏览(29)
  • 数据结构(Java实现)LinkedList与链表(下)

    ** ** 结论 让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。 LinkedList的模拟实现 单个节点的实现 尾插 运行结果如下: 也可以暴力使用 全部代码 MyLinkedList IndexOut

    2024年02月11日
    浏览(35)
  • 数据结构(Java实现)LinkedList与链表(上)

    链表 逻辑结构 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。 无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。 链表的实现 创建一个链表 遍历单链表 、 得到

    2024年02月11日
    浏览(39)
  • 【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。

                                                       大家好,今天我们来学习数据结构中的顺序表与链表!源码在最后附上 首先我们先来认识一下 顺序表 :                                       **如上图所示:很多人会以为数组就是顺序表,顺序表就是数组,这

    2024年02月21日
    浏览(35)
  • 【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)

    🎁 单链表的节点中只有一个 next 指针引用着下一个节点的地址 🎁 当要获取单链表中的最后一个元素的时候,需要从头节点开始遍历到最后 🎁 单链表一开始的时候有 first 头指针引用着头节点的地址 💰 双向链表可以提升链表的综合性能 💰 双向链表的节点中有 prev 指针引

    2024年02月12日
    浏览(34)
  • [java数据结构] ArrayList和LinkedList介绍与使用

    (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的模拟实现 5. LinkedList的优缺点 (四) ArrayList和LinkedList的区别

    2024年01月21日
    浏览(37)
  • java八股文面试[数据结构]——ArrayList和LinkedList区别

      ArrayList和LinkedList的异同 二者的线程都不安全,相对线程安全的Vector,执行效率高。此外,ArrayList时实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedList比较占优势,因为LinledList要移动指针。对于新增和删除操作add

    2024年02月11日
    浏览(38)
  • java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

    对于数据结构我这边只告诉你右边框框里的 栈的特点:后进先出,先进后出,入栈也成为压栈,出栈也成为弹栈 栈就像一个弹夹 队列先进先出后进后出 队列像排队 链表查询满 但是增删快(相对于数组而言) 拓展:还有一个双向链表 他在查询元素的时候更快些,因为他在拿到一个元素

    2024年02月05日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包