LeetCode 82. 删除排序链表中的重复元素 II (C语言)

82.删除排序链表中的重复元素 II

Description


给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现的数字。

Analyze


链表操作,删除一个有序链表中的所有重复元素。
给定函数如下:

  • @param head 链表的头结点(带数据)

首先考虑特殊情况:

  • 给定的链表为空
  • 给定的链表只有一个元素

上述两种都是特殊情况,但在此题处理方法都是一样的,即返回给定的链表

然后考虑一般情况:

比较发现当前结点和下一结点值相同时,应当把当前结点和下一结点一起排除在外,即当前结点也是要删除的对象,因此需要知道当前结点的前驱结点,注意, 此前驱结点并不是当前结点的 直接前驱结点,而是原表中没有出现重复的结点。

这里又有一个新的问题出现了,就是当判断出第一个元素和第二个相等时,应当把这两个元素一起排除,此时有两种解决方法:

  • 一种是直接把头结点的值和 next 指向的地址一起修改,即把整个 head 修改成符合条件的结点,并作为要返回的链表的头结点
  • 还有一种是给原来的链表设定一个头指针 h ,此时只要修改 h->next 为新的节点就行了,返回时返回 h->next

显然。上述两种方法都是可行的,但是在实际编程的时候会发现,第一种不能写入遍历链表的循环中,要单独写出来,甚至要单独写一个循环来判断新的链表头结点在何处,因此下面我们采用第二种方法。

解决了这些看起来是小问题的问题,这道题其实就已经做出来一半了,主要思路是通过比较 head,moveNode 两个指针指向的数据来判断哪个结点应该保留,并把它放到 ***h***所指向的链表中去。

Realization


  • 特殊情况处理

  • 定义三个重要的指针并初始化

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值