今天开始讲和大家坚持打卡面试非常重要算法练习---剑指offer,希望我们能一起肝。

1 题目描述

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

2 思路1----python

将所有节点得值放到一个列表中,再筛选出值数量为1得值----python

3 思路2----c++

  • 需要删除重复节点,我们需要保留一个待删除节点之前得节点,代码中使用pre表示

  • 使用一个指针指向当前遍历得节点

  • 当头节点与后续节点相等时需额外处理

4 代码实现

c++版本

//author xiaolan
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    
{
        if (pHead == NULL)
            return NULL;
        ListNode *pre = NULL;
        ListNode *p = pHead;
        int flag = 0;   //判断是否出现重复节点,当flag==1时,当前节点出现重复
        while (p)
        {
            while (p->next && p->val == p->next->val)  //如果节点重复,一直遍历下去
            {
                flag = 1;
                p = p->next;
            }
            if (flag == 0)   //如果当前节点不重复,遍历下一个节点
            {
                pre = p;
                p = p->next;
            }
            else     //如果当前节点重复,分类处理
            {
                flag = 0;
                if (pre == NULL)   //如果从头结点开始出现重复,重置头结点指针
                {
                    pHead = p->next;
                    p = pHead;
                }
                else              //否则,跳过重复的节点
                {
                    pre->next = p->next;
                    p = pre->next;
                } 
            }
        }
        return pHead;
    }
};

java版本

public class Solution {
    public ListNode deleteDuplication(ListNode head){
        ListNode first=new ListNode(-1);//新建一个头节点,避免,从head就开始重复
        first.next=head;
        ListNode current=head;
        ListNode start=first;  //保存重复节点的前一个节点
        while(current!=null&&current.next!=null){
            if(current.val==current.next.val){
                int value=current.val;
                while(current!=null&&current.val==value){
                    current=current.next;
                }
                 start.next=current;
            }else{
                start=current;
                current=current.next;
            }
        }
        //注意要返回first.next,避免从head就开始重复,而head被删除
        return first.next;
    }
}

python版本

#author xiaolan
class Solution:
    def deleteDuplication(self, pHead):
        res = []
        # 所有元素入列表
        while pHead:
            res.append(pHead.val)
            pHead = pHead.next
        res = list(filter(lambda c: res.count(c) == 1, res))
        dummy = ListNode(0)
        pre = dummy
        for i in res:
            node = ListNode(i)
            pre.next = node
            pre = pre.next
        return dummy.next

5 唠嗑

2020年7月23日打卡,打卡格式"打卡XX天"。暖蓝汇聚大家一起,探讨简历修改,面试经历分享,尽全力让大家能在2020找到理想的工作。如果你想加入,加我拉你进面试交流群。