【剑指Offer】删除链表中重复的节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点

    因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head

  用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if((pHead == nullptr) || (pHead->next == nullptr))
        {
            return pHead;
        }
        //因为没有传二级指针进来,且头结点也有可能被删除,所以构建一个新结点Head
        ListNode *Head = new ListNode(0);
        Head->next = pHead;
        
        ListNode *pPrev = Head;
        ListNode *pNode = pHead;
        while(pNode != nullptr)
        {
            bool flag_repeat = false;//判断是否有重复结点
            if((pNode->next != nullptr) && (pNode->val == pNode->next->val) )
            {
                flag_repeat = true;
            }
       //没有重复节点 if(flag_repeat == false) { pPrev = pNode; pNode = pNode->next; }
       //有重复节点 else { ListNode *pDelete = pNode; //重复的节点不保留 while((pNode->next != nullptr) && (pNode->val == pNode->next->val)) { pNode = pNode->next; //只删了原来的那个 delete pDelete; pDelete = pNode; } pPrev->next = pNode->next; pNode = pNode->next; //删第二个 delete pDelete; pDelete = pNode; } } return Head->next; } };

  

相关题目:

  编程实现单链表的逆转函数:实现单链表的逆转函数,输入一个链表,反转链表后,返回翻转之后的链表。

  找出单链表中的一个节点,该节点到尾指针的距离为K:找出单向链表中的一个节点,该节点到尾指针的距离为K。链表的倒数第0个结点为链表的尾指针。要求时间复杂度为O(n)。

  每K个一组反转链表:给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

  

猜你喜欢

转载自www.cnblogs.com/xiexinbei0318/p/11419901.html