题目分析:
- 从有序的链表中,将出现重复的元素全部去除。如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; }