日常刷题中!🐵
GitHub链接:diwei00 (github.com)
https://github.com/diwei00
刷题代码都在Exercise库中提交
题目:
给定一个已排序的链表的头
head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例1🎈
输入:head = [1,1,2] 输出:[1,2]示例2🎈
输入:head = [1,1,2,3,3] 输出:[1,2,3]
LeetCode链接:
83. 删除排序链表中的重复元素 - 力扣(LeetCode)https://leetcode.cn/problems/remove-duplicates-from-sorted-list/
解析:
由于这个是单链表的结构,所以当我们要删除某一个节点时,必须要能找到下一个节点的地址,否则就没法去链接了。那么我们再删除重复节点时,只能一个一个节点的去删除。
核心思想🐵
循环遍历,如果当前节点值等于下一个节点值,则将当前节点链接到下下个节点,跳过相同值的节点。否则,当前节点等于下个节点,向后遍历链表 。
注意🐵
一般遍历链表有两个结束条件,一个是节点为空,一个是节点的下驱指针next为空,要根据不同的情景去判断。
代码实现:
struct ListNode* deleteDuplicates(struct ListNode* head)
{
//循环遍历,如果当前节点值等于下一个节点值,则将当前节点链接到下下个节点
//跳过相同值的节点
//否则,当前节点等于下个节点,向后遍历链表
struct ListNode* phead = head;
if (phead == NULL)
{
return head;
}
while (phead->next != NULL)
{
if (phead->val == phead->next->val)
{
phead->next = phead->next->next;
}
else
{
phead = phead->next;
}
}
return head;
}
小结:
对于链表的操作一定要保证其链接性,所以思路会和顺序表的题目有所差异,需要我们大量去练习,拓展我们的思路。