1、题目
2、思路
首先创建一个新的链表,设定新的头节点为res ,poc = res;同时设定一个变量记录上个数用于与本次的数进行比较。设定这个数为f,则判断条件为,poc.val!=head.val;head.val!=head.next.val;f !=head.val;这三者同时成立的时候则可以将节点拼接在poc后面。同时记得f不断的更新,以及最后一个元素是否需要加入节点。
3、代码
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode deleteDuplicates (ListNode head) {
// write code here
if(head == null || head.next == null){// 当空链表或者只有一个节点时直接返回。
return head;
}
ListNode res = new ListNode(-1); // 新建节点
ListNode poc = res; // 遍历节点
int f = -1; // 当前遍历节点的前一项
while(head != null){
if(poc.val != head.val && head.val != head.next.val && head.val != f){ // 不需要特别找出第一个非重复元素
poc.next = new ListNode(head.val); // 每找到一个非重复元素加入新的链表后面
poc = poc.next;
}
f = head.val; // 更新,确保下一次遍历时能对比是否重复
head = head.next;
if(head.next == null){ // 当原链表到头
if(head.val != f){ // 判断最后一个是否需要加入新链表
poc.next = new ListNode(head.val);
}
break;
}
}
res = res.next; // 因为第一个是-1
return res;
}
}
当然本题还可以使用递归,题解中有很多,可以看一下