删除排序链表中的重复元素(力扣83.)
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
思考:
一次遍历即可,注意适时判断,避免访问到空节点的元素。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head){
if(head == NULL || head -> next ==NULL)
return head;
struct ListNode* p = head;
while(p != NULL && p -> next != NULL) {
if(p -> val == p -> next -> val ) {
p -> next = p -> next -> next;
} else {
p = p -> next;
}
}
return head;
}
删除排序链表中的重复元素 II(力扣82.)
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
思考:
仍然可以做到一次遍历解决,但是考虑到头节点也有可能被删除,需要一个哑节点。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head){
if(head == NULL || head -> next == NULL) {
return head;
}
struct ListNode *prev = (struct ListNode *)malloc(sizeof(struct ListNode));
prev -> next = head;
struct ListNode* p = prev ;
while(p -> next != NULL && p -> next -> next != NULL) {
if(p -> next -> val == p -> next -> next -> val) {
int x = p -> next -> val;
while(p -> next != NULL && p -> next -> val == x) {
p -> next = p -> next -> next;
}
} else {
p = p -> next;
}
}
return prev -> next;
}