如果链表中的元素如3 --2 --1--3--2--1,结果应该是3--2--1
思路:三个指针,两个用于遍历,一个用于释放内存
首先用一个temp指针指向链表中的第一个元素,当元素存在的情况下,让指针pre指向temp,pre实际上是把链表中的所有元素遍历一次,每当temp移动一次,pre会从temp开始的位置一直移动到末尾,在让pre遍历时要判定pre->next是否存在,如果不存在说明已经到末尾了。如果找到末尾都没找到就开始让temp向后移动一位,如果在pre的遍历过程中找到了,就删除pre->next的那个节点。这是就需要用上第三个指针del去指向pre->next;让pre->next指向del->next,这样链表不会断,然后free(del).
代码如下:
int list_delete_repeat(list* head)
{
list *pre,*del;
list* temp = head->next;
while(temp){
pre = temp;
while(pre->next){
if(pre->next->data == temp->data){
del =pre->next;
pre->next = del->next;
free(del);
}else{
pre = pre->next;
}
}
temp = temp->next;
}
return 0;
}
下面提供测试代码:
list.h文件
#ifndef _LIST_H_
#define _LIST_H_
typedef int data_t;
typedef struct Lnode{
data_t data;
struct Lnode* next;
}list;
list* list_init();
int list_insert(list* head,int data);
int list_print(list* head);
int list_delete_repeat(list* head);
#endif
list.cpp文件
#include "list.h"
#include <cassert>
#include <iostream>
using namespace std;
list* list_init()
{
list* head = new list;
assert(NULL != head);
head->next = NULL;
return head;
}
int list_insert(list* head,int data)
{
list* node = new list;
assert(NULL != node);
node->data = data;
node->next = head->next;
head->next = node;
return 0;
}
int list_delete_repeat(list* head)
{
list *pre,*del;
list* temp = head->next;
while(temp){
pre = temp;
while(pre->next){
if(pre->next->data == temp->data){
del =pre->next;
pre->next = del->next;
free(del);
}else{
pre = pre->next;
}
}
temp = temp->next;
}
return 0;
}
int list_print(list* head)
{
list* temp = head->next;
while(temp){
cout<<temp->data<<"--";
temp = temp->next;
}
cout<<endl;
return 0;
}
~