【算法通关村第一关——链表青铜挑战笔记】

链表的内部结构

什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。

链表的入口节点称为链表的头结点也就是head。

如图所示:
在这里插入图片描述

注意:这里的next,记录的是下一个链表的地址,并不是像数组一样是直接、连续的结构。

链表类型

单链表

下面是Java中单链表的结构定义:

public class ListNode{
	//节点的值
	int val ;
	//下一个结点
	ListNode next;
	//结点的构造参数(无参)
	public ListNode(){}
	 //结点的构造函数,一个参数
    public ListNode(int val) {
        this.val = val;
    }

    //结点的构造函数 两个参数
    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

如图所示:
在这里插入图片描述

插入结点

插入结点分为三种情况,从链表头部插入、从链表中间插入或者从链表后插入。
(1)从链表中间插入:
先遍历到要插入点的位置。将该位置结点的前结点的指针指向该节点,该节点的指针指向后面节点的一个位置。

如图所示:
在这里插入图片描述


(2)从链表头部插入
直接将插入的结点的下一个指针指向前头结点。

(3)从链表后插入: 将结点尾的指针指向需要插入的结点。
代码
 /**
     * 在指定位置插入一个结点
     * @param node 链表头结点
     * @param nodeInsert  待插入链表
     * @param index 待插入位置 从1开始
     * @return
     */
    public static ListNode AddElement(ListNode node,ListNode nodeInsert,int index){
        if (node == null){
            return nodeInsert;
        }
        ListNode dumy = new ListNode();
        //设置虚拟头结点
        dumy.next = node;
        ListNode cur = dumy;
        ListNode temp = null;
        int size = 0;
        while (cur != null && cur.next !=null){
            cur = cur.next;
            size++;
            if (size == index){
                temp = cur.next;
                cur.next = nodeInsert;
                nodeInsert.next = temp;
            }
        }
        return dumy;
    }
删除结点

将需要删除的结点’'空出来",即可完成删除该节点。同样也需要考虑到表头结点、最后一个结点、中间结点的情况。在这里插入图片描述
(1)删除表头结点
删除表头结点,需要将head = head.next,新头结点就是原结点的第二个结点。

(2)删除最后一个结点
将最后一个结点的前结点指针指向null,即可。

(3)删除中间结点
找到位置后,cur.next = cur.next.next,即可。
注意:cur为需要删除结点的上一个结点。因为单链表,只有前找后,没有后找前。
如图所示:
在这里插入图片描述

代码
public static ListNode deleteElement(ListNode node,int index){
        if (node == null){
            return null;
        }
        ListNode dumy = new ListNode();
        ListNode cur = dumy;
        dumy.next = node;
        int size = 0;
        while (cur!=null && cur.next != null){
            cur = cur.next;
            size++;
            if (size == index){
                cur.next = cur.next.next;
            }
        }
        return dumy;
    }

双链表

下面是Java中双链表的结构定义:

public class DoubleNode {
    //数据域
    public int data;
    
    //指向下一个结点
    public DoubleNode next;
    
    //指向上一个结点
    public DoubleNode prev;
    
    public DoubleNode(int data){
        this.data = data;
    }
    public DoubleNode(int data,DoubleNode next){
        this.data = data;
        this.next = next;
    }
    public DoubleNode(int data,DoubleNode next,DoubleNode prev){
        this.data = data;
        this.next = next;
        this.prev = prev;
    }
}

如图所示:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值