描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5
数据范围:链表长度满足 1 <= n <=1000 ,链表中的值满足 1<=val<=1000
进阶:空间复杂度O(n) ,时间复杂度 O(n)
描述
给定的排序列表会有三种情况:
1、pHead == NULL, 即空链表
2、pHead->next == NULL, 即给定有序链表只有一个头节点
3、pHead->next->next == NULL, 即给定有序链表有两个节点
4、pHead->next->next != NULL, 即给定有序链表节点数大于等于三
那么,我们针对以上四种情况,思考如何删除重复节点
1、空链表,直接返回NULL即可
2、只有一个节点的链表,直接返回pHead即可,不会存在重复节点的情况
3、有两个节点的链表,对比pHead->val和pHead->next->val是否相等
若pHead->val和pHead->next->val相等,两个节点都需要删除,返回NULL即可
若pHead->val和pHead->next->val不相等,两个节点都不需要删除,返回pHead即可
4、对于节点数大于等于三的情况,会有两种可能:
(1)需要删除的节点为头节点
(2)需要删除的节点非头节点
代码实现
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pHead ListNode类
* @return ListNode类
*/
struct ListNode* deleteDuplication(struct ListNode* pHead ) {
// write code here
if (pHead == NULL) {
return NULL;
}
if (pHead->next == NULL) {
return pHead;
}
if (pHead->next->next == NULL) {
if (pHead->val == pHead->next->val) {
return NULL;
} else {
return pHead;
}
}
int num[1000];
memset(num, 0, sizeof(int) * 1000);
struct ListNode* p = pHead;
while(p != NULL) {
num[p->val-1]++;
p = p->next;
}
p = pHead;
struct ListNode* currt = pHead;
while(currt != NULL) {
if (num[currt->val-1] > 1) {
if (currt == p && p == pHead) {
pHead = pHead->next;
p = pHead;
currt = pHead;
} else {
p->next = currt->next;
currt = p->next;
}
} else {
if (p == currt && p == pHead) {
currt = p->next;
} else {
p = p->next;
currt = currt->next;
}
}
}
return pHead;
}