数据结构——链表篇java版(新手入门)

1、链表(LinkedList)介绍

1.1、什么是链表

链表(linked list)是⼀种在物理上 ⾮连续、 ⾮顺序的数据结构,由若⼲节点 (node)所组成。链表中数据元素的逻辑顺序是通过链表中的指针链接次序实现 的。链表由⼀系列结点(链表中每⼀个元素称为结点)组成,结点可以在运⾏时动 态⽣成。每个结点包括两个部分:⼀个是存储数据元素的数据域,另⼀个是存储下 ⼀个结点地址的指针域。

1.2、单向链表:

单链表的第⼀个节点的存储位置叫做头指针,最后⼀个节点的后继指针为空,⼀般 ⽤ NULL 或者 “^” 表示。

除了上⾯的,有时候为了操作⽅便,会在单链表的第⼀个节点前⾯加⼀个节点,称 之为头节点。这个头节点⼀般不存储任何内容,它的指针域指向单链表的第⼀个节 点。

单向链表代码初始化:

1.2.1、单向链表代码实现
//单向链表常用操作
//定义链表
public class ListNode {
    //数据域
    Integer data;
    //指针域,指向下⼀个节点
    public ListNode next;
    //节点的构造函数(无参)
    public ListNode() {
    }
    // 节点的构造函数(有一个参数)
    public ListNode(int data) {
        this.data = data;
    }
    // 节点的构造函数(有两个参数)
    public ListNode(int data, ListNode next) {
        this.data = data;
        this.next = next;
    }
​
    /**
     * 1、向链表尾部添加结点
     * @param data 结点的值
     */
    public static void addData(ListNode head,int data){
        //初始化要加入的结点
        ListNode newNode=new ListNode(data);
        //临时结点
        ListNode temp=head;
​
        if(temp==null){
            head=newNode;
        }
        //找到尾结点
        while(temp.next!=null){
            temp=temp.next;
        }
        //添加结点
        temp.next=newNode;
    }
​
    /**
     * 2、插入结点
     * @param head 头结点
     * @param data 插入结点的值
     * @param index 插入结点的位置(放到原来结点的前面)(从0开始)
     */
    public static void insertNode(ListNode head,int data,int index){
        //新建预插入的结点
        ListNode newNode=new ListNode(data);
        //临时虚拟头结点
        ListNode temp=head;
        //记录结点的位置
        int current=0;
        while(temp!=null){
            //得到前一个结点
            if(current==(index-1)){
                newNode.next=temp.next;
                temp.next=newNode;
            }
            current++;
            temp=temp.next;
        }
    }
​
    /**
     * 3、获取链表的长度
     * @param head
     * @return
     */
    public static int linkedListLen(ListNode head){
        //记录链表的长度
        int len=0;
        //临时头结点
        ListNode temp=head.next;
        while(temp!=null){
            len++;
            temp=temp.next;
        }
        return len;
    }
​
    /**
     * 4、根据位置删除结点
     * @param head 头结点
     * @param index 删除的位置(从0开始)
     */
    public static void deleteNode(ListNode head,int index){
        //临时虚拟头结点
        ListNode temp=head;
        //记录当前遍历的位置
        int current=0;
        while(temp!=null){
            if(current==(index-1)){
                temp.next=temp.next.next;
            }
            current++;
            temp=temp.next;
        }
    }
​
    public static void main(String[] args) {
        //虚拟头结点
        ListNode head=new ListNode();
        addData(head,7);
        addData(head,9);//7,9
        insertNode(head,6,1);//6,7,9
        deleteNode(head,1);//7,9
        int len = linkedListLen(head);//2
        System.out.println("链表长度为"+len);//2
        System.out.println("分别为:");
        ListNode temp=head.next;
        //遍历链表
        while(temp!=null){
            int date=temp.data;
            System.out.println(date);//6,8,9
            temp=temp.next;
        }
​
​
    }
}
​
1.3、双向链表

双向链表,顾名思义,两个⽅向向的链表。相⽐起单链表来说,它多了⼀个前驱指 针 prev,指向前驱节点。这样双向链表既可以往前⾛,也可以往后⾛。

1.4、循环链表

链表的尾节点指向头节点形成⼀个环,称为循环链表

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值