力扣刷题——链表 day1

力扣刷题——链表

学习代码随想录,进行链表相关算法题刷题。学习中大量参考别人的思路和做题想法,刚开始也总是寸步难行,因此也想好好记录学习,希望能用自己朴素的语言理解算法题的做法,刷题中收获最多的往往也是自己总结的方式方法,希望自己能够多坚持坚持,有精力有时间就更新打卡一下自己刷题的进度,大家一起好好学习,努力奋斗。

1、反转链表

力扣序号206
该题思路:使用双指针方法对该题进行解答。
代码如下步骤:

  • 定义指针cur,指向头节点head,定义指针pre指针初始化为nullptr,定义指针temp。
  • 接下来进行链表的反转,首先指针temp保存cur->next然后改变cur->next的朝向指向pre指针,此时已经反转第一个节点。
  • 开始重新移动,将指针pre赋予cur,然后指针cur赋予之前指针temp所保存的值,并且循环下去,直至cur为nullptr,也就是上一次赋值的cur->next为nullptr,因此说明最后一个节点也已经完成反转。
  • 反转链表的任务完成。输出我们的指针pre,也就是我们的反转后链表的头节点。

代码如下:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head;
        ListNode* pre = nullptr;
        ListNode* temp;
        while (cur != nullptr) {
            temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
};

2、两两交换链表中的节点

力扣序号24
解题思路:使用虚拟头节点,正常的每次进行未来两个节点的交换即可,注意保存会被覆盖的节点。

代码如下步骤:

  • 记录临时节点,记录会被覆盖和难以寻找的节点,将指针cur赋为虚拟头节点,记录cur->nextcur->next->next->next

  • cur->next = cur->next->next;

  • cur->next->next = temp1;为之前记录的临时节点。

  • cur->next->next->next = temp2;进入下一轮的交换。

  • 指针cur移动两位。

代码如下:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* cur = dummyHead;
        while (cur->next != nullptr && cur->next->next != nullptr) {
            ListNode* temp1 = cur->next;
            ListNode* temp2 = cur->next->next->next;
            cur->next = cur->next->next;
            cur->next->next = temp1;
            cur->next->next->next = temp2;
            cur = cur->next->next;
        }
        return dummyHead->next;
    }
};

3、删除链表的倒数第N个节点

力扣序号19
解题思路:使用虚拟头节点处理,双指针方法解决问题。
代码如下步骤:

  • 定义虚拟头节点dummyHead,指针fast和slow,初始值为虚拟头节点。
  • 为了实现能够走到倒数第n个节点,并且删除,我们应当走到目标点的前一个,然后slow->next = slow->next->next;即可删除目的。因此我们为了完成该目的,使用双指针思想。
  • 让fast先行,fast先行的步数n,然后fast和slow一起动,那么两个指针之间的间距为先行的步数,倘若最后fast到了nullptr,那么倒数第n个节点为slow指向,但我们需要指向倒数第n个的前一个节点,因此我们需要fast先行时多走一步,即可达到该目的。
  • 最终得到后输出dummyHead->next即可。

代码如下:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* fast = dummyHead;
        ListNode* slow = dummyHead;
        while (n-- && fast != nullptr) {
            fast = fast->next;
        }
        fast = fast->next;
        while (fast != nullptr) {
            fast = fast->next;
            slow = slow->next;
        }
        slow->next = slow->next->next;
        return dummyHead->next;
    }
};
  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值