程序员面试金典--删除链表中重复的结点

程序员面试金典--删除链表中重复的结点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

tips:

    在链表中,需要处理投头节点的时候,不妨增加一个 extra 节点,来方便操作。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead == NULL || pHead->next == NULL){
            return pHead; 
        }
        ListNode *extra = new ListNode(1); 
        extra->next = pHead; 
        
        ListNode *tmp, *t = extra; 
        while( t->next && t->next->next ) {
            tmp = t->next; 
            while( tmp->next && tmp->next->val == tmp->val){
                tmp = tmp->next; 
            }
            if(tmp != t->next){
                t->next = tmp->next; 
            }else{
                t = t->next; 
            }
        }
        return extra->next;  
        
    }
};

  

原文地址:https://www.cnblogs.com/zhang-yd/p/7285610.html