p108 有序链表删除重复节点(leetcode 82)

一:解题思路

Time:O(n),Space:O(1)

二:完整代码示例 (C++版和Java版)

C++:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head)
    {
        ListNode* dummy = new ListNode(0);
        dummy->next = head;
        ListNode* prev = dummy;
        ListNode* cur = prev->next;

        while (cur!=NULL)
        {
            while (cur->next != NULL && cur->val == cur->next->val) cur = cur->next;
            if (prev->next != cur) prev->next = cur->next;
            else prev = prev->next;
            cur = prev->next;
        }

        return dummy->next;
    }
};

Java:

class Solution {
        public ListNode deleteDuplicates(ListNode head)
        {
               ListNode dummy=new ListNode(0);
               dummy.next=head;
               ListNode prev=dummy;
               ListNode cur=prev.next;
               while (cur!=null)
               {
                   while (cur.next!=null && cur.val==cur.next.val) cur=cur.next;
                   if(prev.next!=cur) prev.next=cur.next;
                   else prev=prev.next;
                   cur=prev.next;
               }

               return dummy.next;
        }
    }

原文地址:https://www.cnblogs.com/repinkply/p/12663146.html

时间: 2024-08-27 05:21:32

p108 有序链表删除重复节点(leetcode 82)的相关文章

list链表之:从链表删除一个节点list_del

从链表删除一个节点使用接口list_del,使用list_del时要非常注意. list_del的实现如下: static inline void list_del(struct list_head *entry) { __list_del(entry->prev, entry->next); entry->next = LIST_POISON1; entry->prev = LIST_POISON2; } static inline void __list_del(struct

CareerCup之2.1无序链表删除重复元素

[题目] 原文: 2.1 Write code to remove duplicates from an unsorted linked list. FOLLOW UP How would you solve this problem if a temporary buffer is not allowed? 译文: 从一个未排序的链表中移除重复的项 进一步地, 如果不允许使用临时的缓存,你如何解决这个问题? [分析] (1)如果可以使用额外的存储空间,我们就开一个数组来保存一个元素的出现情况.

【剑指offer】18.删除链表中重复节点

思路 实现 /* 说下大概思路: 与链表的其他题目类似,为了防止删除头结点的极端情况发生,先创建空结点dummy,使dummy指向传入的head结点. 然后创建cur的指针,指向链表的头部(即dummy). 接着对cur指针迭代,因为要对比cur(cur最初始的定义指向空结点)指针的下一个结点与下下一个结点的值是否相等,为了防止产生空指针异常,故退出迭代的条件为:cur.next != null && cur.next.next != null. 在迭代过程中,如果cur.next.val

删除链表的重复节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路:难点在于指针的控制.... /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */ public ListNode deleteD

删除有序链表中重复的元素

比如 1->2->2->3,删除重复后,变为1->3. void delDup(Node* head) { Node node; node.next = head; Node* n1, n2; n1 = node; n2 = node->next; int data; while (n2) { data = n2->data; n2 = n2->next; if (n2 && n2->data == data) { n2 = n2->n

双链表删除一个节点

写了一个删除双链表节点的程序,在这里记录一下,直接上代码,代码中的主要步骤都有注释. 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <assert.h> 5 typedef struct NODE{ 6 struct NODE *prior; 7 struct NODE *next; 8 int value; 9 }Node; 10 void print

双链表删除/插入节点

//双链表删除节点 dnode *del(dnode *head, int num) { dnode *p1, *p2; p1 = head; while (num != p1->data && p1->next != NULL) { p1 = p1->next; } if (num == p1->data) { if (p1 == head) { head = head->next; head->pre = NULL; free(p1); } else

c++ 链表删除重复的数据

//List.h #include <iostream> typedef int dataType; struct Node{ Node():data(0),pNextNode(NULL){} //结点构造函数 dataType data; Node* pNextNode; }; class List{ private: Node *head; //作为链表唯一的头指针 int size; //链表长度 public: List(){head=new Node;size=0;} bool is

【LeetCode每天一题】 Remove Duplicates from Sorted List II(移除有序链表中重复的节点)

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinctnumbers from the original list. Example 1: Input: 1->2->3->3->4->4->5 Output: 1->2->5 Example 2: Input: 1->1->1->2->3 Output