删除链表中重复的结点_牛客题霸_牛客网 (nowcoder.com)(点击前方链接查看题目)
一、题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5
数据范围:链表长度满足 0≤n≤1000 0≤n≤1000 ,链表中的值满足 1≤val≤1000 1≤val≤1000
进阶:空间复杂度 O(n) O(n) ,时间复杂度 O(n) O(n)
例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:
示例1
输入:{1,2,3,3,4,4,5}
复制返回值:{1,2,5}
示例2
输入:{1,1,1,8}
返回值:{8}
二、解题思路以及代码
本题需要考虑三种情况:
1.中间删除:
2.头删:
由于刚开始next值为NULL,所以直接将next赋给pHead
例:1 1 1 3 4
3.尾删:
next在循环中会一直走到NULL 所以要加上遍历条件
如果next为NULL ,NULL->next则会报错
例:2 3 4 5 5 5
struct ListNode* deleteDuplication(struct ListNode* pHead ) {
if (pHead == NULL || pHead->next == NULL)
{
return pHead;
}
struct ListNode* cur = pHead;
struct ListNode* prev = NULL;
struct ListNode* next = cur->next;
while (next)
{
if (cur->val != next->val)
{
prev = cur;
cur = next;
next = next->next;
}
else
{
while (next->val == cur->val && next != NULL)
{
next = next->next;
}
cur = next;
if (prev != NULL)
{
prev->next = next;
}
else
{
pHead = next;
}
if (next != NULL)
{
next = next->next;
}
}
}
return pHead;
}