LeetCode:LC67 remove-duplicates-from-sorted-list

题目描述

给出一个排好序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。

例如:

给出的链表为1->2->3->3->4->4->5, 返回1->2->5.

给出的链表为1->1->1->2->3,  返回2->3.

输入

{1,2,2}

输出

{1}

程序流程:

首先根据前插法输入值建立链表,然后在deleteDuplicates函数中处理后返回新链表的队首指针,再依次输出新链表元素即可

思路不是通用思路,有些繁琐。只能说我的思维喜欢走弯路吧?不够灵活没有其他大佬写得那么简易哈哈哈!

想分析代码的读者可以举一些例子套入代码,一步一步分析大概就清楚了。笔者就不分析了,因为思路比较复杂。初始不同长度的链表要在main中修改对应的长度值。

可运行代码:

#include<iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
//定义结构体
typedef struct ListNode
{
int val;
struct ListNode *next;
}ListNode;

ListNode* deleteDuplicates(ListNode* head){
        // write code here

        //flag用来标记first
           ListNode* first,*last;
           int flag=0;int flag2=0;

        while(1)
        {
        if(head->val!=head->next->val)
        {
            break;
        }
            head=head->next;
        }
        
//head指针移动到新链表尾部时,将first指针赋给head指针
        while(head){
            if(!head->next)
            {
                head=first;
                break;
            }

     
            //1 2 中的1这种情况
            else if(head->val!=head->next->val&&flag==0)
            {
                //first表示新链表的队首指针
                first=head;
                flag=1;
                last=head;
                head=head->next;
            }
            else if(head->val!=head->next->val&&flag==1)
            {
                head=head->next;
                last=last->next;
            }

//head指向的节点值和head指向节点的后一个节点值相等时
            else if(head->val==head->next->val)
            {
                while(1)
                {
                    if(head->next==NULL)
                    {
                        flag2=1;
                        break;
                    }
                    else if(head->val!=head->next->val)
                    {
                        break;
                    }
                head=head->next;
                }
                if(flag2==0)
                {
                head=head->next;
                last->next=head;
                }
                else
                {
                last->next=head->next;
                }
            }

        }
      return first;
}
int main()
{
ListNode *L=new ListNode;
L->next=NULL;
ListNode *r=L;
//4表示链表元素为4个,此处可修改
for(int i=0;i<4;i++)
{
    ListNode *p=new ListNode;
    cin>>p->val;
    r->next=p;
    r=p;
}
ListNode *q=L;
ListNode * first=deleteDuplicates(L);
//依次输出处理后的链表元素
while(first)
{
    first=first->next;
    cout<<first->val<<' ';
}
}

猜你喜欢

转载自blog.csdn.net/Zhongtongyi/article/details/107282266