LeetCode热题100—链表(二)

19.删除链表的倒数第N个节点

题目

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

示例 1:

img

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

示例 2:

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

示例 3:

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

思路

这道题很明显要用双指针,因为捕获不到链表的长度,那么可以考虑快慢指针,让快指针先走n步,然后快慢指针同步进行,当快指针走到最后一个节点时,满指针正好是要删除指针的前面一项,此时进行slow->next = slow->next->next;即可,问题解决。

代码如下:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
         ListNode* first = head;
         ListNode* second = head;
         while(n--){
            second = second->next;
         }
         if(second == NULL){
            return head->next;
         }
         while(second->next != NULL){
            first = first->next;
            second = second->next;
         }
         first->next = first->next->next;
         return head;
    }
};

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

题目

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

示例 1:

img

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

示例 2:

输入:head = []
输出:[]

示例 3:

输入:head = [1]
输出:[1]

思路

肯定也是双指针,每次要移动两步,那么写个循环,如果下两个存在任何一个等于NULL,就跳出,记得前一个要写前面,那么就不会走||后面的判断,以及要记得最开始的特判,如果小于两个直接return head

代码如下:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head == NULL || head->next == NULL)return head;
        ListNode* first = head; 
        ListNode* second = head->next;
        while(1){
            int tmp = first->val;
            first->val = second->val;
            second->val = tmp;
            if(second->next == NULL || second->next->next == NULL)break;
            first = second->next;
            second = second->next->next;
        }
        return head;
​
    }
};

25.K个一组翻转链表

题目

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

示例 1:

img

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

示例 2:

img

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

思路

可以考虑成一个栈,每k个就全入栈,然后依次弹出来并且接到后面,并且把下一次的开始继续保留下来继续更新,代码如下:

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        stack<ListNode*> stk;
        ListNode* dum = new ListNode();
        ListNode* p = dum;
        while(1){
            int count = k;
            ListNode* tmp = head;
            while(count && tmp){
                stk.push(tmp);
                tmp = tmp->next;
                count--;
            }
            if(count){  //如果此时不足k个,则直接退出,此时tmp为最后一个的下一个
            //head为前一组k个的下一个,此时直接接到后面即可
                p->next = head;
                break;
            }
            while(!stk.empty()){
                p->next = stk.top();
                stk.pop();
                p = p->next;
            }
            head = tmp;
        }
        return dum->next;

相关推荐

  1. LeetCode 100 | (下)

    2024-06-09 23:00:01       37 阅读
  2. LeetCode100】【】环形 II

    2024-06-09 23:00:01       18 阅读
  3. LeetCode100】【】排序

    2024-06-09 23:00:01       48 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 23:00:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 23:00:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 23:00:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 23:00:01       20 阅读

热门阅读

  1. tengine+lua的镜像制作

    2024-06-09 23:00:01       9 阅读
  2. CSS:字数超出容器范围,超出部分省略,变成...

    2024-06-09 23:00:01       25 阅读
  3. #09 Stable Diffusion动画制作入门

    2024-06-09 23:00:01       11 阅读
  4. oracle开发中常用的sql语句

    2024-06-09 23:00:01       12 阅读
  5. autosar RTE模块功能介绍

    2024-06-09 23:00:01       11 阅读
  6. Rating Compression(单调栈,树状数组)

    2024-06-09 23:00:01       13 阅读
  7. React@16.x(23)useEffect

    2024-06-09 23:00:01       16 阅读
  8. Python进阶之-mmap详解

    2024-06-09 23:00:01       12 阅读
  9. AcWing 33:链表中倒数第k个节点 ← 尾插法

    2024-06-09 23:00:01       14 阅读
  10. Day06 - Day10

    2024-06-09 23:00:01       12 阅读