[算法通关村] 1.3 链表的删除

上一节我们谈到了链表的头插、尾插、中间插入的方法,忘记的小伙伴可以复习一下:

[算法通关村] 1.2 链表的插入


 

        接下来,完成链表的删除工作,我们在上一节的学习中,分别在链表的开头、中间和结尾插入了节点,现在我们想使链表恢复原来的样子,即:1 -> 2 -> 3 -> 4 -> 5,这需要我们分别删除位于头部的 72、位于第三位的节点 30、以及作为结尾的节点 9,这部分内容是比较简单的,按照惯例,完整代码放在最下方。

删除中间节点

        删除中间节点时,只需要找到它的前驱结点,使前驱结点的 next 指向它的 next 节点即可,此时由于不存在引用关系,会被 JVM 回收。

 

        其关键代码如下:

cur.next = cur.next.next;

删除头部结点

        删除头部节点十分简单,直接让 head 指向 head.next 即可,直接给出图和代码:

return head.next;

 

删除尾部结点

        删除尾部节点同样容易,只需要将尾部节点的前一个节点中 next 变量值等于 null 即可,同样直接给出图与代码:

cur.next = cur.next.next;

 

完整代码

         下面给出该部分的完整代码:

class NewNode {

    public int val;
    public NewNode next;

    NewNode(int val) {
        this.val = val;
        this.next = null;
    }
}

public class BasicLinkList {

    public static void main(String[] args) throws Exception {
        // 先创建一个链表
        NewNode linkedList = BasicLink.initLinkedList(new int[]{1, 2, 3, 4, 5});

        NewNode newNode;

        // 中间插入节点:在第 3 个节点前,插入 val = 30
        // 头部插入节点:插入 val = 72
        // 尾部插入节点:插入 val = 9

        // 中间删除节点:第 4 个节点
        System.out.println(BasicLinkList.toString(BasicLinkList.deleteNode(linkedList, 4)));
        System.out.println("========");
        // 头部删除节点:
        linkedList = BasicLinkList.deleteNode(linkedList, 1);
        System.out.println(BasicLinkList.toString(linkedList));
        System.out.println("========");
        // 尾部删除节点:
        System.out.println(BasicLinkList.toString(BasicLinkList.deleteNode(linkedList, BasicLinkList.getLength(linkedList))));
    }

    /**
     * 获取链表长度
     *
     * @param linkedList 链表头节点
     * @return 链表长度
     */
    public static int getLength(NewNode linkedList) throws Exception {
        int length = 0;
        NewNode current = linkedList;
        while (current != null) {
            length++;
            current = current.next;
        }
        if (length == 0) {
            throw new Exception("链表不存在");
        }
        return length;
    }

    /**
     * 删除节点
     *
     * @param head     链表头节点
     * @param position 删除节点位置,取值从1开始
     * @return 删除后的链表头节点
     */
    public static NewNode deleteNode(NewNode head, int position) throws Exception {

        if (position < 1 || position > getLength(head)) {
            throw new Exception("参数:拟删除位置 越界");
        }
        if (position == 1) {
            //curNode就是链表的新head
            return head.next;
        }

        NewNode cur = head;
        int count = 1;
        // 找到拟删除节点的前一个节点
        while (count < position - 1) {
            cur = cur.next;
            count++;
        }

        cur.next = cur.next.next;

        return head;
    }

    /**
     * 输出链表
     *
     * @param head 头节点
     */
    public static String toString(NewNode head) {
        NewNode current = head;
        StringBuilder stringBuilder = new StringBuilder();
        while (current != null) {
            stringBuilder.append(current.val).append("\t");
            current = current.next;
        }
        return stringBuilder.toString();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值