题目:给你一个链表的头节点 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;
}
给定一个已排序的链表的头 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;
}