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; }