删除排序链表里面的重复元素,留下不重复的元素

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:

输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:

输入: 1->1->1->2->3
输出: 2->3

分析:这种题一般分为两种实现,一种构建一个新的链表,一种是原地操作。

如果用构建一个新链表的方式,假设链表是[n1, n2, n3 ... null],需要从头遍历找到一段非重复的元素[n1-ni),然后把[n1, ni)用尾插的方式插入到新链表中。然后从ni开始重复上面的操作,直到链表结束,即n1 == null。

如果进行原地操作,同样的,需要记录连续序列的前一个节点current(在数据关系上可以称之为n0),因为做删除操作的时候需要用到,然后同样找重复元素[n1-ni],如果没有找到重复元素,那么前进一步,如果找到了,那么将current的下一个节点直接置为ni,然后继续从ni开始重复执行。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (head == NULL || head->next == NULL) {
            return head;
        } 
        
        ListNode s(0), *current = &s;
        s.next = head;
        
        for (ListNode * next = head; next != NULL;) {
            if (next->next == NULL) {
                break;
            }
            
            int samecount = 0;
            ListNode* diff = next->next;
            for (;diff != NULL && diff->val == next->val;diff=diff->next, ++samecount);
            if (samecount == 0) {
                current = current->next;
                next = next->next;
            } else {
                current->next = diff;
                next = diff;
            }
        }
        
        return s.next;
    }
};

猜你喜欢

转载自blog.csdn.net/P_J_STL/article/details/81226144