1- 思路
-
- 定义虚拟头结点
-
- 定义 cur 指针,cur指针始终指向虚拟头结点,依此操作
cur.next
和 cur.next.next
-
- while条件为依此判断两个连续的结点,
while(cur.next!=null && cur.next.nex!=null)
-
- 如果当前后两个结点出现重复,则一直去重到没有重复元素为止
-
- 如果当前后两个结点没有重复元素,则直接移动 cur
2- 题解
⭐删除排序链表中的重复元素 II——题解思路
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null){
return head;
}
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode cur = dummyHead;
while(cur.next!=null && cur.next.next!=null){
if(cur.next.val == cur.next.next.val){
int x = cur.next.val;
while(cur.next!=null && x==cur.next.val){
cur.next = cur.next.next;
}
}else{
cur = cur.next;
}
}
return dummyHead.next;
}
}
3- ACM模式
import java.util.List;
import java.util.Scanner;
public class deleteDuplicates {
public static class ListNode{
int val;
ListNode next;
ListNode(){}
ListNode(int x){
val = x;
}
}
public static ListNode deletDuplicates(ListNode head){
if(head==null){
return head;
}
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode cur = dummyHead;
while(cur.next!=null && cur.next.next!=null){
if(cur.next.val==cur.next.next.val){
int x = cur.next.val;
while(cur.next!=null && x==cur.next.val){
cur.next = cur.next.next;
}
}else{
cur = cur.next;
}
}
return dummyHead.next;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("输入链表长度");
int n = sc.nextInt();
ListNode head=null,tail=null;
for(int i = 0 ; i < n;i++){
ListNode newNode = new ListNode(sc.nextInt());
if(head==null){
head = newNode;
tail = newNode;
}else{
tail.next = newNode;
tail = newNode;
}
}
ListNode forRes = deletDuplicates(head);
System.out.println("删除后的结果为");
while (forRes!=null){
System.out.print(forRes.val+" ");
forRes = forRes.next;
}
}
}