链表: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,相当于中间跳过了一个结点,这样的后果就是重复元素不能被删除干净。
荡尘涤污,重整河山,便在今日