⭐️ 往期链表相关OJ
💫链接1:链表分割
💫链接2:链表中倒数第k个结点(快慢指针问题)
💫链接3:leetcode 876.链表的中间结点(快慢指针问题)
💫链接4:leetcode 206.反转链表
💫链接5:leetcode 203.移除链表元素
💫链接6:合并两个有序链表
💫链接7:链表相交
⭐️ 题目描述
🌟 牛客链接:删除链表中重复的结点
图解和思路:
1️⃣ c代码:
/*** struct ListNode {* int val;* struct ListNode *next;* };*/
/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param pHead ListNode类 * @return ListNode类*/
struct ListNode* deleteDuplication(struct ListNode* pHead ) {// 空链表if (pHead == NULL) return pHead;struct ListNode* cur = pHead;struct ListNode* prev = NULL;struct ListNode* next = pHead->next;while (next != NULL) {if (cur->val != next->val){prev = cur;cur = next;next = next->next;} else {while ((next != NULL) && (next->val == cur->val)) {next = next->next;}// 如果不相等 停下// 删除 [cur , next) 区间的元素while (cur != next) {// 保存下一个结点的位置struct ListNode* curNext = cur->next;free(cur);cur = curNext;}// 调整 prev == NULL 代表是头出现重复结点 所以要单独处理if (prev != NULL) {prev->next = next;} else {pHead = cur;}// 如果 next 已经提前到尾 则不需要调整if (next != NULL)next = cur->next;}}return pHead;
}