Remove Duplicates from Sorted List
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.
题意:删除有序链表的值重复的节点,给定一个有序链表,删除出现重复值的节点
解题思路:通过比较前后两个节点值,若重复就删除一个节点,若不重复就遍历下一个节点。
设置一个临时变量用于存储当前节点的指针,比较当前节点的值与下一个节点值是否相同
若相同则删除下一个节点,并让指针指向下下一个节点,若下一个节点的指针为空则退出,若两个节点值不相等则指针向后移动一位,继续比较
难点:重复节点的判断,指针的移动,重复节点的释放。
C语言实现代码如下:
/**
* 解题思路:删除有序链表中的相同的节点值,遍历链表,设置一个临时变量用于存储当前节点的指针,比较当前节点的值与下一个节点值是否相同
* 若相同则删除下一个节点,并让指针指向下下一个节点,若下一个节点的指针为空则退出,若两个节点值不相等则指针向后移动一位,继续比较
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *deleteDuplicates(struct ListNode *head) {
struct ListNode *temp, *temp1, *p;
p = head;
if(head == NULL){//若链表为空,则返回
return NULL;
}
temp1 = temp = NULL;
while(p->next != NULL){
temp = p->next;
if(p->val == temp->val){//若两节点值相等
if(temp->next != NULL){//若下下一个节点存在,删除下一个节点,指针指向下下一个节点
temp1 = p->next->next;
p->next->next = NULL;
p->next = temp1;
}else{//若下下一个节点不存在,则表示到达链表尾部,退出循环
p->next = NULL;
break;
}
}else{//若两节点值不相等,指针向后移动一位
p = temp;
}
}
return head;
}