2024/9/21 leetcode 19题 24题

目录

19.删除链表中的倒数第n个结点

题目描述

题目链接

解题思路与代码

24.两两交换链表中的结点

题目描述

题目链接

解题思路与代码


==================================================

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]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

题目链接

19.删除链表中的倒数第n个结点

解题思路与代码

就看这个例子,n = 2,

我们思路就是通过一个nhead虚拟头节点,然后定义left和right两个指针来求解。

假设链表一共m个结点,然后删除倒数第n个结点。

先让right 向右移动n个结点

然后让left和right同步移动

然后此时我们发现left->next就是要删除的结点,然后我们直接left->next = left->next ->next;

就可以求解,同时我们需要注意,需要对left->next进行delete操作,防止链表中只存在一个结点的情况。nhead->next就是我们最后返回结果。

这个方法原理就是,先然right移动n,那么之后left和right同步移动,相当于移动(m - n)次,这样left就处于了我们要删除节点的前一个结点,从而简化问题。

(c++代码)

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* nhead = new ListNode(0);
        nhead ->next = head;
        ListNode* left = nhead;
        ListNode* right = nhead;
        while( n -- ) {
            right = right ->next;
        }
        while(right != NULL && right ->next != NULL) {
            left = left->next;
            right = right ->next;
        }
        ListNode* tem = left ->next;
        left->next = left->next->next;
        delete(tem);
        return nhead ->next;
    }
};

24.两两交换链表中的结点

题目描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

复制代码
输入:head = [1,2,3,4]
输出:[2,1,4,3]

示例 2:

复制代码
输入:head = []
输出:[]

示例 3:

复制代码
输入:head = [1]
输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

题目链接

24.两两交换链表中的结点

解题思路与代码

本题就是交换相邻结点,然后我们还是创立一个虚拟头节点pre ,然后我们使用cur进行遍历。

一次交换

二次交换

最终返回pre ->next即可

(c++ 代码)

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* nhead = new ListNode();
        nhead ->next = head;
        ListNode* cur = nhead;
        while( cur ->next != NULL && cur ->next ->next != NULL) {
           ListNode* start = cur ->next;
           ListNode* end = cur ->next ->next;
           cur ->next = end;
           start ->next = end ->next;
           end ->next = start;
           cur = start;
        }
        return nhead ->next;
    }
};
相关推荐
不想当程序猿_11 分钟前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
落魄君子22 分钟前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
菜鸡中的奋斗鸡→挣扎鸡30 分钟前
滑动窗口 + 算法复习
数据结构·算法
Lenyiin39 分钟前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码1 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
scan7241 小时前
LILAC采样算法
人工智能·算法·机器学习
菌菌的快乐生活1 小时前
理解支持向量机
算法·机器学习·支持向量机
大山同学1 小时前
第三章线性判别函数(二)
线性代数·算法·机器学习
axxy20002 小时前
leetcode之hot100---240搜索二维矩阵II(C++)
数据结构·算法
黑客Ash2 小时前
安全算法基础(一)
算法·安全