using System;
using System.Collections.Generic;
/*
public class ListNode
{
public int val;
public ListNode next;
public ListNode (int x)
{
val = x;
}
}
*/
class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode deleteDuplicates (ListNode head) {
// write code here
if (head == null) return null;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode cur = head;
ListNode pre = dummy;
while (cur != null && cur.next != null) {
if (cur.val == cur.next.val) {
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
}
pre.next = cur.next;
} else {
pre = cur;
}
cur = cur.next;
}
return dummy.next;
}
}
原链表升序
需要一个虚拟头结点dummy,作为原链表的上一个结点(即dummy.next = head)
一个指针用于遍历链表,另一个指针用于判断当前元素是否是重复元素。具体步骤如下:
- 创建一个虚拟头节点dummy,并将其next指向原链表的头节点。
- 创建两个指针,分别命名为curr和prev。初始时,curr指向dummy的next节点,prev指向dummy。
- 遍历链表,当遇到重复元素时,将curr移动到链表的最后一个重复元素,即跳过所有重复元素。然后将prev的next指向curr的下一个非重复元素。
- 如果遇到不重复的元素,将prev移动到curr,将curr移动到下一个节点。
- 最后返回dummy的next节点作为新的链表头。