/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param ListNode head is the head of the linked list
* @return: ListNode head of linked list
*/
public static ListNode deleteDuplicates(ListNode head) {
// write your code here
if(head==null){
return null;
}
ListNode list=head;
while(list.next!=null){
if(list.val==list.next.val){
if(list.next.next==null){
list.next=null;
}else{
ListNode node=list.next;
list.next=node.next;
}
}else{
list=list.next;
}
}
return head;
}
}
目测你的代码少了一行
if (node.val == node.next.val)
这里如果相等,那么将当前链表节点接上下面那个,这个没错
但如果不相等呢,你什么也没做,这导致死循环了
所以应该
else
{
head = head.next; //把它移到else分支,如果相等,那么因为head已经指向next.next了,不需要
}
if (head.val==head.next.val) {
head.next = head.next.next;
head = head.next;
}
这里的判断有问题:
~
例如输入: 1、1、1、2、3
根据你的判断,头节点的值等于下一个节点的值,会删除第二个节点,然后你把头结点指向了删除后的下一个节点(也就是第三个节点)
~
变成这样:1、1、2、3
重复的1就不能完全去掉。凡是超过3个连续的重复节点就去不掉了。
修改为下面应该就没问题了:
if (head.val==head.next.val) {
head.next = head.next.next;
}else{
head = head.next;
}