首页 > 其他分享 >【数据结构】链表(2)

【数据结构】链表(2)

时间:2024-09-30 13:22:03浏览次数:3  
标签:node head prev ListNode cur next 链表 数据结构

 【LinkedList的模拟实现】

这是java中的一个集合类,可以当成链表来使用,作为链表时,它视为包含三个域,是一个双向链表

【构建LinkedList框架】

public class MyLinkedList
{
    static class ListNode
    {
        public int val;
        public ListNode prev;//前驱
        public ListNode next;//后继

        public ListNode(int val)
        {
            this.val = val;
        }
    }

    public ListNode head;//标志头节点
    public ListNode last;//标志尾节点
}

【得到双向链表的长度】

 public int size()
    {
        int count = 0;
        ListNode cur = head;
        while(cur != null)
        {
            count++;
            cur = cur.next;
        }
        return count;
    }

【打印双向链表的值】

 public void display()
    {
        ListNode cur = head;
        while(cur != null)
        {
            System.out.println(cur.val + " ");
            cur = cur.next;
        }
            System.out.println();
    }

【查找关键字key是否在链表中】

public boolean containsKey(int key)
    {
        ListNode cur = head;
        while(cur != null) 
        {
            if (cur.val == key) 
            {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

【头插法】

1.链表不为null时,node的next域中存放head指向的节点地址(node.next = head)

2.head的prev域中存放node指向的节点地址(head.prev = node)

3.head指向node(head = node)

 public void addFirst(int data)
    {
        ListNode node = new ListNode(data);
        if(head == null)//判断是否是首次插入节点
        {
            head = last = node;
        }else
        {
            node.next = head;
            head.prev = node;
            head = node;
        }
    }

【尾插法】

1.链表不为null时,last所指向节点的next域中存放node指向的节点地址(last.next = node)

2.node的prev域中存放last指向的节点地址(node.prev = last)

3.last指向node(last = node )(或者last = last.next)

 public void addLast(int data)
    {
        ListNode node = new ListNode(data);
        if(head == null)//判断是否是首次插入节点
        {
            head = last = node;
        }else
        {
            last.next = node;
            node.prev = last;
            last = node; //last = last.next;
        }
    }

【任意位置插入】

单链表时如果想插2位置,需要找到2的前一个节点,相当于要定义一个cur,走到目标位置的前一个节点,但双向链表是可以通过prev直接知道前一个节点的地址的

1.直接记录index位置的节点cur

2.node的next域被设置为cur指向的节点地址(node.next = cur)

3.cur的前驱节点中的next域被设置为cur指向的节点地址(cur.prev.next = node)

4.node的prev域被设置为cur前驱中所存放的节点地址(node.prev = cur.prev)

5.cur的prev域被设置为node指向的节点地址(cur.prev = node)

 public void addIndex(int index, int data)
    {
        //1.判断index的合法性
        try {
            checkIndex(index);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //2.index == 0 || index == size()
        if(index == 0)
        {
            addFirst(data);
            return;
        }
        if(index == size())
        {
            addLast(data);
            return;
        }
        //3.找到index位置
        ListNode cur = findIndex(index);
        ListNode node = new ListNode(data);
        //4.进行链接
        node.next = cur;
        cur.prev.next = node;
        node.prev = cur.prev;
        cur.prev = node;

    }

    private ListNode findIndex(int index)//找到index位置
    {
       ListNode cur = head;
       while(index != 0)
       {
           cur = cur.next;
           index--;
       }
       return cur;
    }

    private void checkIndex(int index) throws InterruptedException//检查index是否合法
    {
        if(index < 0 || index > size())
        {
            throw new IndexNotLegalException("index不合法");
        }
    }

【删除关键字为key的节点】

1.找到关键字key所在的节点cur

2.cur前驱节点的next域被设置为cur的next域中所存放的节点地址(cur.prev.next = cur.next)

3.cur后继节点的prev域被设置为cur的prev域中所存放的节点地址(cur.next.prev = cur.prev)

public void remove(int key)
    {
        ListNode cur = head;
        while(cur.next != null)
        {
            if(cur.val == key)
            {
                if(cur == head)//处理头节点
                {
                    head = head.next;
                    if(head != null)
                    {
                        head.prev = null;
                    }else//head为null,证明只有一个节点
                    {
                        last = null;
                    }
                }else
                {
                    cur.prev.next = cur.next;
                    if (cur.next == null)//处理尾节点
                    {
                        last = last.next;
                    } else {
                        cur.next.prev = cur.prev;
                        return;
                    }
                }
                }
            cur = cur.next;
        }
    }

【清空链表】

public void clear()
    {
        ListNode cur = head;
        while(cur != null)
        {
            ListNode curN = cur.next;
            cur.prev = null;
            cur.next = null;
            cur = curN;
        }
        head = last =  null;
    }

标签:node,head,prev,ListNode,cur,next,链表,数据结构
From: https://blog.csdn.net/2301_81305165/article/details/142448542

相关文章

  • Scala数据结构简单介绍
    数据结构的定义: 1.数组(Array)    (1)定义:        定长数组:newArray[T](数组长度)        变长数组:ArrayBuffer[T]()    (2)示例:        定长数组:valarr1=newArray[Int](3)        变长数组(需提前导包):valarr2=Arr......
  • 203_移除链表元素
    203_移除链表元素【问题描述】给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例一:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例二:输入:head=[],val=1输出:[]示例三:输入:head=[7,7,7......
  • 数据结构:基本概念及术语
    一、基本概念        在数据结构中,有这样一些基本概念:数据、数据元素、数据项、数据对象,对于它们的具体含义我就不赘述了,在这就简要说明一下它们之间的关系:    首先,我们可以把数据看成一个大集合,那数据元素就相当于这个集合中的一个个元素,然后一些性质相同的......
  • 97th 2024/8/26 树形数据结构小结
    精锐线段树\(\big/\)平衡树综合题目五步取首1、每个节点需要维护的信息有?可从题目要求的目标或经推导后得到的要求的目标得到如对于括号序列这一题,将"("转化为-1,")"转化为1后,要求的答案就变成了最大前缀和和最小后缀和然后就变成了平衡树板题(区间赋值,反转,翻转)2、需要的标记......
  • c语言实现:链表创建、插入、删除、翻转
    #include<stdio.h>#include<stdlib.h>//链表创建typedefstructNode{intdata;structNode*next;}Node;//创建一个节点Node*createNode(intdata){Node*newNode=(Node*)malloc(sizeof(Node));newNode->data=data;newNode......
  • 【Redis基础篇】超详细♥Redis安装教程、5种常用数据结构和常见命令、Jedis和SpringDa
    文章目录一、Redis与客户端安装教程1、NoSQL介绍(1)结构化与非结构化(2)关联和非关联(3)查询方式(4)事务(5)总结2、Redis介绍3、安装Redis(1)依赖库(2)上传安装包并解压(3)Redis三种启动方式①默认启动②指定配置启动③开机自启4、Redis客户端(1)Redis命令行客户端(2)图形化桌面客户端(3......
  • Java中的队列数据结构及其应用
    Java中的队列数据结构及其应用队列是一种线性数据结构,遵循先进先出(FIFO)的原则,即最先插入的元素最先被移除。队列的基本操作包括入队(enqueue)、出队(dequeue)和查看队头元素(peek)。本文将介绍队列的基本结构、操作及在JDK中的应用。队列的基本结构一个简单的队列可以用数组或......
  • Java-数据结构-Map和Set-(二)-哈希表 |ू・ω・` )
    文本目录:❄️一、哈希表:  ☑1、概念:    ☑2、冲突-概念:    ☑3、冲突-避免:     ☞1)、避免冲突-哈希函数的设计:     ☞2)、避免冲突-负载因子调节(重点):    ☑4、冲突-解决:      ➷1)、解决冲突-闭散列: ......
  • 数据结构————顺序表
    1.线性表什么是线性表呢大家往下面看:其实线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串(线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是......
  • 数据结构(顺序表)
    无论你期望或者不期望,清晨依旧来临。--谏山创《进击的巨人》线性表的概念1.线性表是n个具有相同特性的数据元素的有限序列。2.线性表在逻辑上是线性结构,但是在物理结构上并不⼀定是连续的。3.线性表在物理上存储时,通常以数组和链式结构的形式存储。顺序表的概念......