题解 |NO.16 #删除有序链表中重复的元素-II#3.8

删除有序链表中重复的元素-II

https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* deleteDuplicates(ListNode* head) {
        //空链表或只有一个结点
        if(head == nullptr || head->next == nullptr)
            return head;
        //添加一个头结点
        ListNode* temp = new ListNode(-1);
        temp->next = head;
        //pre指向比较的两个结点之前的结点,cur1与cur2指向两个比较的结点
        ListNode* pre = temp;
        ListNode* cur1 = head, *cur2 = head->next;
        //q用于删除结点空间
        ListNode* q = nullptr;
        //当cur2不为空,则继续遍历链表
        while(cur2 != nullptr){
            //两结点值相同
            if(cur1->val == cur2->val){
                //一直删除到只剩一个,别忘记cur2!=nullptr,因为cur2后移了
                while(cur2 != nullptr && cur1->val == cur2->val){   
                    q = cur2;
                    cur1->next = cur2->next;
                    cur2 = cur2->next;
                    delete q ;
                }
			  	//删除cur1所指结点,即该组重复结点中的第一个结点
                pre->next = cur2;
                q = cur1;
                delete q;
			  	//检查是否还有结点未遍历
                if(cur2 != nullptr){
                    cur1 = cur2;
                    cur2 = cur2->next;
                }
			 //当前结点值不同,三个指针后移
            }else{
                pre = pre->next;
                cur1 = cur1->next;
                cur2 = cur2->next;
            }
        }
	    //释放临时头结点
        head = temp->next;
        delete temp;
        return head;
    }
};

全部评论

相关推荐

认真搞学习:这个真喷不了,你是我见过最美的牛客女孩
点赞 评论 收藏
分享
03-26 15:18
已编辑
华北水利水电大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务