代码随想录算法训练营第三天| 203. 移除链表元素、707.设计链表、206.反转链表

1. 移除链表元素

题目链接:203.移除链表元素
1.看到这道题目的第一想法是比较简单,遍历链表找到节点val值等于target的节点,然后删除,即当前节点的上一个节点指向当前节点的下一个节点,所以要定义一个pre指向head,一个cur指向head.next,删除的时候只需pre.next = cur.next,然后将当前指针指向下一个节点cur = cur.next;
2.学习视频链接
3.在写代码的过程中总是会出现一些问题,忽略一些细节,比如忽略了头节点的值就等于目标元素的值,头节点为null的情况

code
if (head == null) {
            return head;
        }
        // 定义一个虚拟头节点
        ListNode dummy = new ListNode(0, head);
        ListNode pre = dummy;
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == val) {
                pre.next = cur.next;
            }
            else {
                // 把pre指向cur
                pre = cur;
            }
            cur = cur.next;
        }
        return dummy.next;
     }

4.学习感悟:在删除节点的过程中,要考虑到头节点被删除的情况,所以可以使用定义一个虚拟头节点的方法;定义了一个pre和cur,再删除了当前元素后,pre指针不用移动,cur要指向cur.next,如果当前元素没被删除,那么pre要指向pre.next 即pre=cur,同时cur=cur.next

2. 设计链表

题目链接:707.设计链表
1.设计链表,看到题目的第一想法是设计一个链表(单链表或者双链表)并实现链表中的一些方法,有一些思路,但是不知道具体该怎么实现
2.学习视频链接

code
// 定义一个size用途存储链表元素个数
    int size;
    // 定义一个虚拟头节点
    ListNode head;

    // 初始化链表
    public MyLinkedList() {
        size = 0;
        head = new ListNode(0);
    }

    // 获取第index个节点的值
    public int get(int index) {
        if (index < 0 || index > size -1) {
            return -1;
        }

        ListNode curNode = head;
        // 从头节点开始遍历,index为几就循环多少次
        for (int i = 0; i <= index; i++) {
            curNode = curNode.next;
        }
        return curNode.val;
    }

    public void addAtHead(int val) {
        addAtIndex(0, val);
    }

    public void addAtTail(int val) {
        addAtIndex(size, val);
    }

    public void addAtIndex(int index, int val) {

        // index大于链表元素个数,无法插入
        if (index > size) {
            return;
        }
        // index小于0,即插入在头节点前index = 0
        if (index < 0) {
            index = 0;
        }
        // 插入新的节点链表长度增加
        size++;
        // 找到要插入节点的前驱节点
        ListNode pre = head;
        // 循环遍历找到index的节点
        for (int i = 0; i < index; i++) {
            pre = pre.next;
        }
        // 定义要插入的节点
        ListNode newNode = new ListNode(val);
        // 插入新节点
        newNode.next = pre.next;
        pre.next = newNode;
    }

    public void deleteAtIndex(int index) {

        if (index >= size || index < 0) {
            return;
        }
        size--;
        if (index == 0) {
            head = head.next;
            return;
        }
        ListNode pre = head;
        for (int i = 0; i < index; i++) {
            pre = pre.next;
        }
        // 删除当前节点
        pre.next = pre.next.next;
    }

4.学习感悟:看到最后的提交记录我才发现已经是二刷了,但是写的时候却不知道怎么写,首先在构建MyLinkedList的时候,要定义一个size属性,添加和删除都是一些基本的操作,要利用好虚拟节点。

3. 反转链表

题目链接:206.反转链表
1.看到这道题目的第一想法是这道题我记得我写过,利用递归解题,要反转整个链表,就先反转前n个节点
2.学习视频链接
3.迭代法,每个节点指向前一个节点,然后pre和cur向后移

code
ListNode pre = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;
            curr.next = pre;
            pre = curr;
            curr = next;
        }
        return pre;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值