一、题目
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素只出现一次 。返回同样按升序排列的结果链表。
结构体定义如下:
struct ListNode {
int val;
struct ListNode *next;
};
示例(1)
输入:head = [1,1,2]
输出:[1,2]
示例(2)
输入:head = [1,1,2,3,3]
输出:[1,2,3]
二、解题思路
(1)定义两个指针变量,p指向第一个节点的地址,q指向第二个节点的地址。
(2)定义一个整形变量temp存放上一个节点的值。
(3)定义一个整形变量flag来计算是否某个值是否出现过第二次。
(4)从第二元素开始遍历,遇到重复值,需要把p的指针域指向q的指针域,p不移动节点,q移动到下一个节点。
(5)遇到不重复的值,p移动到下一个节点,q移动到下一个节点,记住p永远是q的上一个节点。
(6)q移动到空指针时退出循环。
(7)注意哦,传入的head指针变量可能本身就是一个空指针,记得在函数头部加一层空指针判断,我就忘了加了,错了一次嘿嘿,如果有什么需要改进的点,大家多多指教,互相学习,嘿嘿。
三、leecode提交的源码
struct ListNode* deleteDuplicates(struct ListNode* head)
{
struct ListNode *p,*q;
if(head==NULL)
{
return head;
}
int temp = head->val;
int flag = 1;
for(p=head,q=head->next;q!=NULL;q=q->next)
{
flag++;
//printf("old ## flag : %d , temp : %d , q->val : %d , p->next : %x , p : %x , q : %x\n",flag,temp,q->val,p->next,p,q);
if((temp==q->val)&&flag==2)
{
//printf("if 1\n");
p->next = q->next;
flag = 1;
}
else if(temp!=q->val)
{
//printf("if 2\n");
temp = q->val;
p = p->next;
flag = 1;
}
//printf("new ## flag : %d , temp : %d , q->val : %d , p->next : %x , p : %x , q : %x\n#\n",flag,temp,q->val,p->next,p,q);
}
return head;
}
四、虚机环境测试代码
#include<stdio.h>
#include<stdlib.h>
struct ListNode
{
int val;
struct ListNode *next;
};
void main()
{
struct ListNode* deleteDuplicates(struct ListNode* head);
struct ListNode* CreateLinkList(int *array,int num);
void PrintLinkList(struct ListNode* head);
struct ListNode* head,* head1;
int array[] = {1,2,3,3,4,5,6,6};
int len = sizeof(array) / sizeof(int);
head = CreateLinkList(array,len);
PrintLinkList(head);
head1 = deleteDuplicates(head);
PrintLinkList(head1);
}
/*
输入:head = [1,1,2]
输出:[1,2]
输入:head = [1,1,2,3,3]
输出:[1,2,3]
*/
struct ListNode* deleteDuplicates(struct ListNode* head)
{
struct ListNode *p,*q;
if(head==NULL)
{
return head;
}
int temp = head->val;
int flag = 1;
for(p=head,q=head->next;q!=NULL;q=q->next)
{
flag++;
//printf("old ## flag : %d , temp : %d , q->val : %d , p->next : %x , p : %x , q : %x\n",flag,temp,q->val,p->next,p,q);
if((temp==q->val)&&flag==2)
{
//printf("if 1\n");
p->next = q->next;
flag = 1;
}
else if(temp!=q->val)
{
//printf("if 2\n");
temp = q->val;
p = p->next;
flag = 1;
}
//printf("new ## flag : %d , temp : %d , q->val : %d , p->next : %x , p : %x , q : %x\n#\n",flag,temp,q->val,p->next,p,q);
}
return head;
}
struct ListNode* CreateLinkList(int *array,int num)
{
struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *p,*q;
int i;
head->val = array[0];
for(p=head,i=1;i<num;i++)
{
q = (struct ListNode *)malloc(sizeof(struct ListNode));
q->val = array[i];
p->next = q;
p = q;
if(i==num-1)
{
p->next = NULL;
}
}
return head;
}
void PrintInfo()
{
printf("==========================\n");
}
void PrintLinkList(struct ListNode* head)
{
PrintInfo();
struct ListNode* p;
for(p = head;p!=NULL;p=p->next)
{
printf("val : %d , next : %x\n",p->val,p->next);
}
}
五、虚机环境运行结果
六、leecode提交截图