55删除链表中重复的结点

题目描述

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

思路:这题首先熟悉哨兵节点的用法。自己对模板还是没有很好的节点。

//哨兵节点
ListNode dummyNode(-1);
dummyNode.next = head;
head = &dummyNode;
/*理解:这样写的好处可以自动回收多余的这个节点,因为是一个对象,所以使用一个.运算符。接下来的head是一个指针,所以需要取dummyNode的地址。
第二行将哨兵节点的next指向当前head,然后将head移动到哨兵节点,这样做的好处是,可以修改之后结点的指向,如果没有这句,那么处理的时候会写head = head -> next,这样只能移动指针,不能改变指针的指向。*/

考虑问题要思考:

先分情况,当前节点和next节点相等的时候,保存当前节点值,只要和当前节点值一样就一直往下next,如果不相等就直接转移到下一节点。

相似题目:Remove Duplicates from Sorted List

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead){
        if(pHead == nullptr){
            return nullptr;
        }
        ListNode* head = pHead;
        ListNode dummyNode(-1);
        dummyNode.next = head;
        head = &dummyNode;        

        while(head->next != nullptr&& head->next->next != nullptr){
           if(head->next->val == head->next->next->val){
               int tmp = head->next->val;
               while((head->next != nullptr) &&(tmp == head->next->val)){
                   head->next = head->next->next;
               }
           }
            else{
                head = head->next;
            }
        }
        return dummyNode.next;
    }
};

原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8302778.html

时间: 2024-11-09 09:41:00

55删除链表中重复的结点的相关文章

删除链表中重复的结点-剑指Offer

删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路 需要两个指针,一个指向前一个节点preNode,另一个指向当前节点node,如果遇到相等的节点,node向后移动,preNode不动,存下node.val方便后面的比较,直到遇到node和node.next不相等,preNode就可以指向node.n

剑指offer-18-2. 删除链表中重复的结点

剑指offer-18-2. 删除链表中重复的结点 链表 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: 采用递归的方法查找从头节点开始重复的节点 如果没有重复节点,pHead.next指向deleteDuplication(pHead.next)返回的pHead.next本身 如果有重复节点则pHead.next指向pHead

54、删除链表中重复的结点

一.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 二.解法 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 } 10 */ 11 import ja

删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* dele

剑指offer(四十三)之删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 代码1: import java.util.*; public class Solution { public ListNode deleteDuplication(ListNode pHead) { if(pHead == null) return null; //定义一个链

剑指Offer——删除链表中重复的结点

题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 分析: 因为已经排好序了,所以如果相邻的数值一样的话,那么就跳过该数值,不过要记录前一结点的指针,将其next指向后一个没有重复的结点. 代码: 1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 Li

[剑指offer] 56. 删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: class Solution { public: ListNode *deleteDuplication(ListNode *pHead) { if (pHead == NULL || pHead->next == NULL) return pHead; List

删除链表中重复的结点(剑指offer)

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 方法一:递归 两种情况,如果是重复结点怎么办?遇到了就跳过,返回重复节点的下一个结点. 遇到不重复结点?遇到不重复结点直接连上. /* public class ListNode { int val; ListNode next = null; ListNode(int val

剑指offer:删除链表中重复的结点

题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路分析: 要考虑两种情况,链表中结点为0或1,此时直接返回原链表:第二种情况就是链表中包含两个及以上的结点. 解决第一种情况直接进行一个判断即可,第二种情况,需要定义三个指针pre, cur, nex来解决.其中为了最终返回链表头指针,需要额外定义一个指针,指向链表头.这里