您现在的位置是:首页 >技术教程 >【Leetcode -61.旋转链表 -82.删除排序链表中的重复元素Ⅱ】网站首页技术教程

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

YoungMLet 2023-06-20 04:00:02
简介【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;
		}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。