zoukankan      html  css  js  c++  java
  • leetcode[82] Remove Duplicates from Sorted List II

    给定一个有序链表,删除相同值的节点。例如

    Given 1->2->3->3->4->4->5, return 1->2->5.
    Given 1->1->1->2->3, return 2->3.

    我是新建一个ans链表,来存链表中distinct的值。不知道这样符合要求不。

    判断当前的值不等于前面一个也不等于后面一个那么就是符合条件的节点之一。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *deleteDuplicates(ListNode *head) {
            if (head == NULL || head->next == NULL) return head;
            ListNode *ans = new ListNode(0);
            ListNode *pre = ans;
            ListNode *now = head->next;
            ListNode *last = head;
            if (now && now->val != last->val) // 第一次要先判断,因为now从第二个节点开始
            {
                ListNode *tmp = new ListNode(last->val);
                pre->next = tmp;
                pre = pre->next;
            }
            while(now)
            {
                if ((now -> next == NULL || now->next && now->val != now->next->val) && now->val != last->val)
                {
                    ListNode *tmp = new ListNode(now->val);
                    pre->next = tmp;
                    pre = pre->next;
                    now = now->next;
                    last = last->next;
                    continue;
                }
                now = now->next;
                last = last->next;
            }
            head = ans->next;
            delete(ans);
            return head;
        }
    };

    因为我是另外开辟的,所以我还看了原链表中操作的。这个不错:

    用pre和now去删除节点,由于头节点也有可能删除,因此先建一个Head节点连头节点。

    pre从Head开始,用now去判断是否重复。

    如果重复,循环到下一个不同元素之前,把之间的相同元素直接跳过。

    再向前移动pre和now指针。

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *deleteDuplicates(ListNode *head) {
            ListNode *pre,*now,*Head;
            if(!head||!head->next)return head;
            Head=new ListNode(-1);
            Head->next=head;
            pre=Head;
            now=head;
            while(now&&now->next)
            {
                if(now->val == now->next->val)
                {
                    while(now->next && now->val == now->next->val)
                    {
                        now=now->next;
                    }
                    pre->next=now->next;
                    now=now->next;
                }
                else 
                {
                    pre=now;
                    now=now->next;
                }
            }
            head=Head->next;
            delete(Head);
            return head;
        }
    };
  • 相关阅读:
    C# Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
    C# Collection was modified;enumeration operation may not execute
    C# 写文件
    AJAX 入门教程
    ABP 软删除ISoftDelete
    C# 随机列表
    C# ConfigurationManager 类的使用
    mui 关闭当前窗口
    C# 委托
    VSTO:使用C#开发Excel、Word【13】
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4104748.html
Copyright © 2011-2022 走看看