【一天三道算法题】代码随想录——Day11

一. 反转链表
题目链接:https://leetcode.cn/problems/reverse-linked-list/description/
思路:
牛客上101的老熟人啦,首先定义一个cur指针模拟头结点,再定义一个pre指针指向null,模拟尾结点。
反转时,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。
为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。

接下来就是循环走逻辑,继续移动pre和cur指针。
最后,cur 指针从指向头结点到指向null,循环结束,链表也反转完毕。
此时我们return pre指针就可以了,因为pre指针经过反转后就变成了新的头结点。

代码:

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null || head.next == null) {
            return head;
        }
        ListNode pre = null;
        ListNode cur = head;

        while(cur != null) {
            ListNode temp = cur,next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
    }
    return pre;
}

二. 两两交换链表中的节点
题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/description/
思路:第二次遇到这个题咯,还是用老办法,递归!可能有些难以理解,多看几遍,多敲几次,慢慢理解。
代码:

class Solution {
    public ListNode swapPairs(ListNode head) {
        //特值判断
        if(head == null || head.next == null) {
            return head;
        }
        //获取当前节点的下一个结点
        ListNode next = head.next;
        //递归
        ListNode newNode = swapPairs(next.next);
        //交换
        next.next = head;
        head.next = newNode;
        return next;
    }
}

三. 删除链表的倒数第 N 个结点
题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
思路:第二次碰到了,没啥好说的,双指针就是yyds
代码:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        //模拟头结点
        ListNode newHead = new ListNode(0);
        //将模拟头结点与链表链接起来
        newHead.next = head;

        //创建快慢双指针,都从头开始遍历
        //此时的头就是虚拟头结点
        ListNode fast = newHead;
        ListNode slow = newHead;

        //快指针先移动n个位置
        for(int i = 0; i<n; i++) {
            fast = fast.next;
        }

        //俩指针同时开始运动
        while(fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }

        //此时,要删除的节点就是slow的前一个节点
        slow.next = slow.next.next;

        //返回虚拟头结点所链接的链表
        return newHead.next;
    }
}

今天遇到两道之前做过的,当复习啦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值