在一个排序的列表中,存在重复的节点,删除该链表中重复的节点,重复的节点不保存,返回链表头指针

typedef int SListDataType;
//链表中的一个节点
typedef struct Node{
 SListDataType   value;  //值
 struct Node *next;   //下一个节点的地址
 }Node;
//单链表
typedef struct SList{
 Node *first;//    *head    第一个节点的地址
} SList;

用三个指针

SList* DelectDuplication(Node * phead){
    if (phead == NULL){
        return NULL;
    }
        Node * fack = (Node *)malloc(sizeof(Node));//假节点
        fack->next = phead;
        Node *prev = fack;//前驱
        Node *p1 = phead;
        Node *p2 = phead->next;
        while (p2 != NULL){
            if (p1->value != p2->value){//不相等,同时走
                prev = p1;
                p1 = p2;
                p2 = p2->next;
            }
            else{
                while (p2 != NULL&&p2->value == p1->value){//相等,p2先走
                    p2 = p2->value;
                }
             
                Node *cur = p1;
                while (cur != p2){
                    Node *next = cur->next;
                    free(cur);
                    cur = next;
                }
                prev->next = p2;
                p1 = p2;
                if (p2!=NULL){
                    p2 = p2->next;
            }
        }
    }
        phead = fack->next;
        free(fack);
        return phead;
}

上一篇:剑指offer-- 链表中环的入口结点(Java)


下一篇:《剑指offer》第五题(重要!从尾到头打印链表)