第一关链表(青铜)

原来链表这么有用

1.链表的初始化

class Node{
        public int val;
        public Node next;

        public Node(int x) {
            val = x;
            next = null;
        }
}

2.获取链表的长度

public static int getLength(Node head) {
        int length = 0;
        Node node = head;
        while (node != null) {
            length++;
            node = node.next;
        }
        return length;
    }

3.链表的插入
链表的插入有三种方式:
头插法:
在这里插入图片描述
新节点: newNode
交换过程:
newNode.next=head
head=newNode

尾插法:
在这里插入图片描述
新节点:newNode 尾节点: lastNode
交换过程:
lastNode.next=newNode
newNode.next=null

中间插入:
在这里插入图片描述
新节点:newNode 原有的节点node(15),node(7)
交换过程:
newNode.next=node(15).next
node(15).next=newNode
顺序不能错,不然15节点的next就断开了,不是原先的连接了

/**
     * 链表插入
     *
     * @param head       链表头节点
     * @param nodeInsert 待插入节点
     * @param position   待插入位置,取值从2开始
     * @return 插入后得到的链表头节点
     */
    public static Node insertNode(Node head, Node nodeInsert, int position) {
        //头节点为null
        if (head==null){
            return nodeInsert;
        }
        //插入位置越界
        int size = getLength(head);
        if (position>size+1 || position<1){
            return head;
        }
        if (position==1){
            nodeInsert.next=head;
            head=nodeInsert;
            return head;
        }
        Node current=head;
        int curIndex=2;
        while(curIndex<=position){
            if (position==curIndex){
                nodeInsert.next=current.next;
                current.next=nodeInsert;
                return head;
            }
            curIndex++;
            current=current.next;
        }
        return head;
    }

4.链表的删除
删除头节点:
在这里插入图片描述
表头节点是虚拟节点没有值
交换过程:
head=head.next

删除尾节点:
在这里插入图片描述
只需要判断当前节点的下一位cur.next是不是要删除的节点,使当前节点的下一位不可达到即可
交换过程:
if(cur.next.val=40){
cur.next=null;
}

删除中间节点:
在这里插入图片描述
删除中间节点也非常简单,就是跳过中间节点即可
交换过程:
cur.next=cur.next.next

/**
     * 删除节点
     *
     * @param head     链表头节点
     * @param position 删除节点位置,取值从1开始
     * @return 删除后的链表头节点
     */
    public static Node deleteNode(Node head, int position) {
        //无可删除的节点
        if (head==null){
            return null;
        }
        //删除节点越界
        int size = getLength(head);
        if (position<1 || position>size+1){
            return head;
        }
        //删除头节点
        if (position==1){
            head=head.next;
            return head;
        }
        //最多只能到最终节点的前一个
        Node current=head;
        int curIndex=2;
        while(curIndex<position-1){
            curIndex++;
            current=current.next;
        }
        current.next=current.next.next;
        return head;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值