【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;
    }
目录
相关文章
|
5天前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
7 1
|
5天前
|
索引
每日一题:力扣328. 奇偶链表
每日一题:力扣328. 奇偶链表
13 4
|
6天前
leetcode代码记录(移除链表元素
leetcode代码记录(移除链表元素
10 0
【每日一题】LeetCode——反转链表
【每日一题】LeetCode——反转链表
【每日一题】LeetCode——链表的中间结点
【每日一题】LeetCode——链表的中间结点
|
20天前
|
C++
[leetcode 链表] 反转链表 vs 链表相交
[leetcode 链表] 反转链表 vs 链表相交
|
5天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
8 0
|
5天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
10 0
|
6天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
25 4
【刷题】 leetcode 面试题 08.05.递归乘法