题解 | #删除有序链表中重复的元素-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与后面重复元素的连接。
#菜鸟的编程学习#