JZ76 删除链表中重复的节点

1、相似题
image
image

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {

        //判空
        if(head == NULL )
            return nullptr;

        ListNode* p1 = head;
        ListNode* p2 = p1->next;
        while(p2)
        {
            if(p1->val != p2->val)
            {
                p1->next = p2;
                p1 = p1->next;
            }
            p2 = p2->next;
        }
        p1->next = p2;
        return head;
    }
};

2、JZ76 删除链表中重复的节点
image
image


/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead) {

        if(pHead == NULL ) return nullptr;

        ListNode* p = new ListNode(-1);
        p->next = pHead;
        ListNode* p1 = p;
        while(p1->next)
        {
            //设置p2指向p1的下一个的下一个节点
            ListNode* p2 = p1->next->next;
            //当p2不为空 且 p1的下一个的下一个节点的值等于p2的值 时循环
            while(p2 && p1->next->val == p2->val)
                p2 = p2->next;  //p2往后移动
            
            //判断p2是否往后移动,如果没有,则说明没有相同的节点出现,让p1往后移动
            if(p1->next->next == p2)    
                p1 = p1->next;
            //如果p2往后移动,就说明出现了重复的节点
            //那么p1和p2之间的节点就都是重复的节点,都是需要删除的节点
            else
                p1->next = p2;
        }
        return p->next;


    }
};
posted @ 2024-04-13 21:03  蓝色的海嗷  阅读(7)  评论(0编辑  收藏  举报