二、删除排序链表中的重复元素 II
1.遍历
由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。由于链表的头节点可能会被删除,因此我们需要额外设定一个头节点。在我们遍历的过程中,如果遇到一个节点的值和它下一个节点的值相同,我们就先记录下这个节点的前一个节点,然后继续向后寻找直到找到不和这个节点值相同的结点,然后让之前记录的前一个节点的next指向这个不相同的节点即可,具体代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode p = new ListNode();
p.next = head;
ListNode pre = p;
ListNode cur = p.next;
while(cur != null) {
if(cur.next != null && cur.val == cur.next.val) {
while(cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
}
pre.next = cur.next;
cur = cur.next;
} else {
pre = pre.next;
cur = cur.next;
}
}
return p.next;
}
}
复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。