算法22:给定一个排好序的linked list,删除其中所有的重复元素。比如给定1->2->3->3-> 4->4->5,返回1->2->5。给定1->1->1->2->3,返回2->3

来源:互联网 发布:淘宝网平跟女式鞋 编辑:程序博客网 时间:2024/05/16 17:32

算法分析

删除有序链表中所有的重复元素,采用两个指针p和q遍历链表删除的方法,另外设置一个指针指向p指针的前一个节点。需要考虑重复元素在头节点和尾节点的特殊情况。

c++代码

//移除有序链接中重复的元素void LinkList::RemoveAllRepeatData(){    //如果链表为空或者只有一个元素,直接返回    if(head == NULL || head->next == NULL)    {        return;    }    //使用两个指针进行比较    Node* p = head;    Node* q = head->next;    //p的前一个节点    Node* pPre = head;    while(p != NULL && q != NULL)    {        if(p->data == q->data)        {            do            {                q = q->next;                length--;            }            while(p->data == q->data && q->next != NULL);            //如果p是头节点,q是尾节点            if(p == head && q->next == NULL)            {                head = NULL;                return;            }            //如果p是头节点            if(p == head)            {                head = q;                p = q;                pPre = q;                q = q->next;            }            else if (q->next == NULL)//q是尾节点            {                pPre->next = NULL;                break;            }            else            {                //删除p到q的前一个节点之间的节点                pPre->next = q;                p = q;                q = q->next;            }        }        else        {            pPre = p;            p = p->next;            q = q->next;        }    }}
0 0
原创粉丝点击