题目描述
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路一(简单模拟)
- 当链表为空或链表节点的个数为一时,不可能存在重复元素,直接返回头节点。
- 用一个指针来遍历链表,如果当前指针不为空,且当前指针的下一个节点不为空,且两着的值相等,则证明存在两个值相同的节点,用当前指针的next指向当前指针下一个指针的next来删除当前指针的下一个节点(cur.next=cur.next.next),直到当前指针的下一个节点值与当前指针值不相同。
- 完成第二步后,所有与当前指针值相同的链表节点已经被删除,此时需要在链表中删除当前指针指向的节点,即可完成对值为cur.val所有节点的删除,故在遍历链表时,还需记录下当前指针的前一个指针。
- 如果当前指针为链表中的第一个节点,还需注意要修改头指针节点的指向,而且需要注意链表可能最开始的几段都是由相同的数字构成,比如1-1-1-2-2-2-3-3-3-3-4-5,故对头指针的修改可能不止一次。
实现代码(Java)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode pre,cur;
if(head==null||head.next==null)