题解 | #删除有序链表中重复的元素-I#
删除有序链表中重复的元素-I
https://www.nowcoder.com/practice/c087914fae584da886a0091e877f2c79
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @return ListNode类
*/
ListNode* deleteDuplicates(ListNode* head) {
// write code here
if(head==nullptr ||head->next==nullptr) return head;//特殊情况勿漏
ListNode *slow=head,*fast=head->next;
while(fast)
{
if(slow->val==fast->val) //注意不是slow==fast而是val值
fast=fast->next;
else{
slow->next=fast;//fast连接到slow之后
slow=slow->next;//slow向后移动
fast=fast->next;//fast在slow的后一个未知
}
}
slow->next=nullptr;//断开与后面重复元素的连接
return head;
}
};
今日学到知识点【p++和p->next的区别】:若p为指向数组的指针,即顺序存储的话,p++就是指向下一个。若p为指向结构的指针,即为链式存储,那么p->next指向下一个结构成员。
本题思路仍是快慢指针,对于每一组重复数据,确保slow是每一组的第一个元素,而fast是下一组的第一个元素;
首先slow为首元素,而fast为第二个元素,如果slow==fast那么fast后移,直到fast与slow不同,此时fast与slow满足上一行所述情况;这种情况下,让fast连接到slow之后,slow再向后移动,fast也向后移动,移动到slow后,即恢复初始位置;循环往复直至fast为空,此时head->......->slow便是整个链表去重后的效果,slow以后到fast是重复元素,故需断开slow与后面重复元素的连接。
#菜鸟的编程学习#
