前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Leetcode -61.旋转链表 -82.删除排序链表中的重复元素Ⅱ】

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

作者头像
YoungMLet
发布2024-03-01 09:33:46
850
发布2024-03-01 09:33:46
举报
文章被收录于专栏:C++/Linux

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]

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

代码语言:javascript
复制
		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往后迭代;

代码语言:javascript
复制
		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;
		}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Leetcode -61.旋转链表
  • Leetcode -82.删除排序链表中的重复元素Ⅱ
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档