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

#菜鸟的编程学习#
全部评论

相关推荐

铁锈不腻玩家:下面那个袁先生删了,问他怎么回事,头像都换不明白
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务