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;
}
}
}