链表:C++ 删除有序链表重复结点

今天上午被问到删除有序链表中data域相同的结点,也的确好久没手写链表了,下午自己手动写了一个,顺便复习下链表的基础操作

 

输入: 1 1 1 2 2 3 4 4 5 -1
期待输出:1 2 3 4 5

 

#include<iostream>
using namespace std;

typedef struct LNode
{
    int data;
    struct LNode* next;
}LNode,*linkList;//定义链表

void headInit(linkList& l) //头插法,输入负数后结束
{
    l = (linkList)malloc(sizeof(LNode));
    int data;
    l->next = NULL;
    cin >> data;
    while (data > 0)
    {
        linkList p = (linkList)malloc(sizeof(LNode));
        p->data = data;
        p->next = l->next;
        l->next = p;
        cin >> data;
    }
}
void tailInit(linkList& l)//尾插法,输入负数后结束
{
    l = (linkList)malloc(sizeof(LNode));
    int data;
    l->next = NULL;
    cin >> data;
    linkList ptr = l;
    while (data > 0)
    {
        linkList p = (linkList)malloc(sizeof(LNode));
        p->data = data;
        ptr->next = p;
        p->next = NULL;
        ptr = p;
        cin >> data;
    }
}

void display(linkList l)//便利链表
{
    while (l->next !=  NULL)
    {
        l = l->next;
        cout << " " << l->data;
    }
    cout << endl;
}
void headinsert(linkList& l,int ins) //头部插入一个数据
{
    linkList temp = (linkList)malloc(sizeof(LNode));
    temp->data = ins;
    temp->next = l->next;
    l->next = temp;
}
void tailinsert(linkList& l, int ins) //尾部插入一个数据
{
    linkList nex = l;
    while (nex->next != NULL)
        nex = nex->next;
    linkList temp= (linkList)malloc(sizeof(LNode));
    temp->data = ins;
    temp->next = nex->next;
    nex->next = temp;
}
void reverseList(linkList& l) //链表翻转操作
{
    if (l->next== NULL) return;
    linkList pre, nex=NULL;
    pre = l->next;
    l->next = NULL;
    while (pre != NULL)
    {
        nex = pre->next;
        pre->next = l->next;
        l->next = pre;
        pre = nex;
    }
}
void delectSame(linkList& l) //删除链表内相同数据结点
{
    if (l == NULL || l->data == NULL) return;
    int data;
    linkList cur = l;
    while (cur->next != NULL)
    {
        linkList nex = cur->next;
        data = cur->data;
        if (data == nex->data)
        {
            cur->next = nex->next;
            delete(nex);
            continue;
        }
        cur = cur->next;
    }
}
int main()
{
    linkList l;
    tailInit(l);
    display(l);
    tailinsert(l, 9);
    display(l);
    delectSame(l);
    display(l);
}

实际测试:输入1 1 1 2 2 3 4 4 5 -1 

第一行输出链表

第二行输出尾插法插入9后的链表

第三行输出删除重复数据后的链表

 

 

编程中遇到的问题主要还是对当前结点还是当前结点的next域的判断选择。一个比较明显的编程失误是最开始delectSame函数中没有写continue,导致了删除当前结点后还会执行cur=cur->next,相当于中间跳过了一个结点,这样的后果就是重复元素不能被删除干净。



 

posted @ 2021-04-13 15:58  北陌南旬  阅读(206)  评论(0)    收藏  举报