题目分析:
- 从有序的链表中,将出现重复的元素全部去除。如1->2->2->3,去除重复后为1->3
解题思路:
快慢指针实现
定义两个指针,一个指针pre指向当前最终无重复链表的最后一个元素,一个指针cur用于遍历时指向的当前指针,一遍遍历链表;
判断pre->next的元素与cur的元素是否相等,相等,则cur向前移动,继续判断;
当pre->next的元素不等于cur的元素,此时判断pre的next是否为cur,若为cur,则pre指向指向next即可;否则pre指向cur的next,最后cur向前移动,继续判断。
实现程序
ListNode *deleteDuplicates(ListNode *head) { // 链表为空,或链表只有一个元素 if (head == NULL || head->next == NULL) return head; struct ListNode *temp; // 给链表添加一个空的头结点 temp = (struct ListNode *) malloc (sizeof(struct ListNode)); temp->next = head; // 慢指针,当前最终无重复链表的最后一个元素 struct ListNode *pre = temp; // 快指针,当前遍历指针 struct ListNode *cur = head; // 一遍遍历实现 while (cur != NULL) { // 判断无重复链表的next与cur关系 // 相等情况,则cur向前移动,继续判断 while (cur->next != NULL && pre->next->val == cur->next->val) { cur = cur->next; } // pre为cur时,将pre向前移动 if (pre->next == cur) { pre = pre->next; } // pre不为cur时,则pre的new指向cur的next else { pre->next = cur->next; } cur = cur->next; } // 返回最终链表的头结点 return temp->next; }

本文介绍了一种使用快慢指针技术从有序链表中去除重复元素的方法,通过遍历链表,比较相邻节点的值,实现链表去重。
720

被折叠的 条评论
为什么被折叠?



