【Leetcode -61.旋转链表 -82.删除排序链表中的重复元素Ⅱ】

简介: 【Leetcode -61.旋转链表 -82.删除排序链表中的重复元素Ⅱ】

Leetcode -61.旋转链表

题目:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

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

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

示例 2:

输入:head = [0, 1, 2], k = 4

输出:[2, 0, 1]

我们的思路是,每旋转一次,就把尾节点变成头节点,原来尾节点的上一个更新为新的尾节点;

struct ListNode* rotateRight(struct ListNode* head, int k)
    {
        if (head == NULL)
        {
            return NULL;
        }
        struct ListNode* curr = head;
        //使curr走到链表的尾节点,并计算链表长度
        int len = 1;
        while (curr->next)
        {
            curr = curr->next;
            len++;
        }
        //k取len的余数,防止重复旋转
        k %= len;
        //循环迭代
        while (k--)
        {
            //prev每次从头节点开始找尾节点的前一个节点
            struct ListNode* prev = head;
            while (prev->next != curr)
            {
                prev = prev->next;
            }
            //找到后把当前curr尾节点的next接到头节点
            //prev更新为新的尾节点,再赋给curr
            //更新新的头节点
            curr->next = head;
            prev->next = NULL;
            head = curr;
            curr = prev;
        }
        return head;
    }

Leetcode -82.删除排序链表中的重复元素Ⅱ

给定一个已排序的链表的头 head ,删除原始链表中所有重复数字的节点,只留下不同的数字 。

返回已排序的链表 。

示例 1:

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

输出:[1, 2, 5]

示例 2:

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

输出:[2, 3]

我们的思路是,给定一个哨兵位,每次判断这个哨兵位的后两个节点的val是否相等,若相等则记录下它的val为flag,让cur一直往后走,直到cur的val不等于flag;若不相等cur往后迭代;

struct ListNode* deleteDuplicates(struct ListNode* head)
    {
        //哨兵位
        struct ListNode* dummyHead = malloc(sizeof(struct ListNode));
        dummyHead->next = head;
        //cur从哨兵位开始
        struct ListNode* cur = dummyHead;
        //比较cur后面的两个是否相等,
        //若相等则记录下它的val为flag,让cur一直往后走,直到cur的val不等于flag
        //若不相等,cur往后迭代
        while (cur->next && cur->next->next)
        {
            if (cur->next->val == cur->next->next->val)
            {
                int flag = cur->next->val;
                while (cur->next && cur->next->val == flag)
                {
                    cur->next = cur->next->next;
                }
            }
            else
            {
                cur = cur->next;
            }
        }
        //head更新为哨兵位的next,因为原来的头也可能会被删
        head = dummyHead->next;
        free(dummyHead);
        dummyHead = NULL;
        return head;
    }
目录
相关文章
|
10天前
01_移除链表元素
01_移除链表元素
|
2月前
|
存储 算法
LeetCode第86题分隔链表
文章介绍了LeetCode第86题"分隔链表"的解法,通过创建两个新链表分别存储小于和大于等于给定值x的节点,然后合并这两个链表来解决问题,提供了一种简单易懂且操作原链表的解决方案。
LeetCode第86题分隔链表
|
2月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
2月前
|
C++ 索引
leetcode 707.设计链表
本文提供了解决LeetCode 707题"设计链表"的C++实现,包括单链表的节点定义和类方法实现,如添加节点、获取节点值、删除节点等。
|
2月前
|
算法
LeetCode第92题反转链表 II
文章分享了LeetCode第92题"反转链表 II"的解法,通过使用四个指针来记录和更新反转链表段的头部、尾部以及前一个和后一个节点,提供了一种清晰且易于理解的解决方案。
LeetCode第92题反转链表 II
|
11天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
45 6
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
86 2
|
11天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
40 7