问题
- 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
解决
/**
* 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) {
// ListNode dummyHead = new ListNode(0); //创建虚拟头结点
// dummyHead.next = head; //将head移到虚拟头结点后
// ListNode prev = dummyHead; //将虚拟头结点值赋予(链表)变量1
// ListNode cur = prev.next; //将变量1下一个值赋予(链表)变量2
// while (cur != null) { //如果变量2不为空,进行while循环
// int curRepeatNum = 0; //创建一个“计数” 整数
// ListNode difNode = cur; //将变量2赋值给(链表)变量3
// // 找到和cur指向的结点值不同的结点
// while (difNode != null && difNode.val == cur.val) { //如果变量3不为空且变量3==变量2,进行while循环
// curRepeatNum++; //“计数”加一
// difNode = difNode.next; //讲过变量3移动到下一个节点
// }
// // 如果curRepeatNum的值大于1,则表示cur指向的结点重复出现了
// if (curRepeatNum > 1) { //如果“计数”>1(表示重复出现),进行if操作
// prev.next = difNode; //将变量3的值赋予变量1下一位节点
// }else { //否则
// // cur指向的结点没有重复出现,则将变量prev指向cur所指向的结点
// prev = cur; //将变量2的值赋予变量1
// }
// cur = difNode; //将变量3的值赋予变量2
// }
// return dummyHead.next; //返回虚拟链表
// }
// // head为已经创建好的链表
// // 若重复则后面一个必定与前面一个重复,则删除所有含有该数字的节点
// }
// 解法二:
class Solution{
public ListNode deleteDuplicates(ListNode head){
if(head==null){
return head;
} //如果head为空,则直接返回head
ListNode demmp=new ListNode(0,head); //创建虚拟头结点(哑节点),并且将节点位于head之前
ListNode cur=demmp; //创建节点变量
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&&cur.next.val==x){
cur.next=cur.next.next;
}
}else{ //跳过不重复的节点
cur=cur.next;
}
}
return demmp.next; //输出最终链表
}
}
总结
if(cur.next.val==cur.next.next.val){ //将重复节点删除
int x=cur.next.val;
while(cur.next!=null&&cur.next.val==x){
cur.next=cur.next.next;
}