题:https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/
题目大意
对于一个有序链表,若链表中有重复元素,将该元素从链表中去除。
思路
计数
使用sp记录head,然后head 往后 搜索,若 head.val 与 sp.val 相同,head指针向后移动,同时会使用cnt计数。直到 head.val 与 sp.val不同。
fp 为新链表的末尾指针。
若 cnt == 1, 将sp的node指向fp的next。否则,跳过。
/**
* 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 dummy = new ListNode(-1);
ListNode fp = dummy;
while(head!=null){
ListNode sp = head;
int val = head.val;
int len = 1;
head = head.next;
while(head!=null && val == head.val){
len++;
head = head.next;
}
if(len ==1){
fp.next = sp;
fp =fp.next;
}
}
fp.next = null;
return dummy.next;
}
}
双指针
p指向新链表尾点的上一个指针。
判断 若p.next.val != head.val 那说明 p.next 的node 只出现了一次,所以可以保存。
若 不同,那么 找出head后面第一个与 p.next 不同的node,将 该 node 作为 新p.next。
同时若head不为null,将head往后移位。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null)
return null;
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode p = dummy;
head = head.next;
while(head!=null){
if(p.next.val!= head.val){
p = p.next;
p.next = head;
}else{
while(head!=null && head.val == p.next.val){
head = head.next;
}
p.next = head;
}
if(head!=null)
head = head.next;
}
return dummy.next;
}
}