【Leetcode -19.删除链表的倒数第N个结点 -24.两两交换链表中的节点】

简介: 【Leetcode -19.删除链表的倒数第N个结点 -24.两两交换链表中的节点】

Leetcode -19.删除链表的倒数第N个结点

题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1, 2, 3, 4, 5], n = 2

输出:[1, 2, 3, 5]

示例 2:

输入:head = [1], n = 1

输出:[]

示例 3:

输入:head = [1, 2], n = 1

输出:[1]

我们的思路是,创建一个哨兵位,使用快慢指针,快指针从head开始走,慢指针从哨兵位开始走,快指针先走n步,加上哨兵位,和慢指针拉开n+1步,这样才可以使要删除的结点的上一个结点直接指向要删除的结点的下一个结点,即删除倒数第n个节点;

struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
    {
        //创建一个哨兵位,它的next是head
        struct ListNode* p = malloc(sizeof(struct ListNode));
        p->val = 0;
        p->next = head;
        //fast从头结点开始,slow从哨兵位开始
        //fast和slow拉开n个距离,加上哨兵位,实际上是n+1个距离
        //这样才可以使要删除的结点的上一个结点直接指向要删除的结点的下一个结点
        struct ListNode* fast = head, * slow = p;
        for (int i = 0; i < n; i++)
        {
            if (fast == NULL)
            {
                return NULL;
            }
            fast = fast->next;
        }
        //然后fast和slow同时走,当fast为空,slow的next就是要删除的结点
        while (fast)
        {
            slow = slow->next;
            fast = fast->next;
        }
        //更新slow即可
        slow->next = slow->next->next;
        //需要返回哨兵位的next,因为如果要删除的结点是头结点,返回头结点就不行
        struct ListNode* curr = p->next;
        free(p);
        return curr;
    }

Leetcode - 24.两两交换链表中的节点

题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。

必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

输入:head = [1, 2, 3, 4]

输出:[2, 1, 4, 3]

示例 2:

输入:head = []

输出:[]

示例 3:

输入:head = [1]

输出:[1]

我们的思路是,在交换两个节点前设定一个节点curr,每次curr后面的两个节点交换;

初始定义:

第一次交换:

更新curr:

上图之后再次进入循环,node1和node2继续迭代:

后面的图省略,代码如下:

struct ListNode* swapPairs(struct ListNode* head)
    {
        //创建一个哨兵位
        struct ListNode* dummyHead = malloc(sizeof(struct ListNode));
        dummyHead->val = 0;
        dummyHead->next = head;
        //curr从哨兵位开始
        struct ListNode* curr = dummyHead;
        //每次交换的是curr的后两个节点
        while (curr->next && curr->next->next)
        {
            struct ListNode* node1 = curr->next;
            struct ListNode* node2 = curr->next->next;
            curr->next = node2;
            node1->next = node2->next;
            node2->next = node1;
            //更新curr
            curr = node1;
        }
        head = dummyHead->next;
        free(dummyHead);
        return head;
    }
目录
相关文章
|
3月前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
33 1
|
4月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
66 0
|
4月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
95 1
|
4月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
35 0
|
4月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
43 0
LeetCode第二十四题(两两交换链表中的节点)
|
4月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
54 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
8月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
8月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
8月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
8月前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】