删除链表中重复的结点

题目

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。

返回同样按升序排列的结果链表。

思路

1、cur指向当前节点,next指向当前节点的下一一节点,如果当前节点的值 与下一结点的值重复,删除下一结点

2、删除下一节点前,dup_node指向下一结点,代表重复的结点要被删除,下一结点后移,删除dup_node

3、更新当前结点的next指针,使其指向下一结点(如果删除的是链表尾结点,需要做判空处理)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (head == nullptr) {
            return nullptr;
        }

        ListNode *cur = head;
        ListNode *next = head;
        ListNode *dup_node = nullptr;
        while (cur->next != nullptr) {
            next = cur->next;
            while (next != nullptr && cur->val == next->val) {
                dup_node = next;
                next = next->next;
                delete dup_node;
                dup_node = nullptr;  
            }
            cur->next = next;
            if (cur->next != nullptr) {
                cur = cur->next;
            }
        }
        return head;
    }
};

 

posted on 2018-12-20 21:17  tianzeng  阅读(284)  评论(0编辑  收藏  举报

导航