一.遍历删除法
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode deleteDuplicates (ListNode head) {
// write code here
//如果头结点为空,不用删除,直接返回空
if (head == null) {
return null;
}
//定义一个res节点让他的next域指向head
ListNode res = new ListNode(-1);
res.next = head;
//定义一个指针cur指向res
ListNode cur = res;
/*
cur.next等价于判断head结点是否为空,
cur.next.next等价于判断head.next结点是否为空,
如果不为空,则遍历完整个链表
*/
while (cur.next != null && cur.next.next != null) {
/*
cur的指向为待删除结点的上一个结点,
所以判断cur.next.val == cur.next.next.val是否成立
*/
if (cur.next.val == cur.next.next.val) {
//假设用tmp保存待删除第一个结点的值
int tmp = cur.next.val;
/*
如果cur.next不为空且cur.next.val == tmp成立,
修改cur.next域的值为不重复的节点值
*/
while (cur.next != null && cur.next.val == tmp) {
cur.next = cur.next.next;
}
}else {
//如果if语句不进,继续让cur遍历链表
cur = cur.next;
}
}
/*
有可能头结点就是要删除的结点,返回res.next
*/
return res.next;
}
}
二.哈希表遍历法
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode deleteDuplicates (ListNode head) {
// write code here
//如果头结点为空,返回空
if (head == null) {
return null;
}
//创建一个map存储值
Map<Integer, Integer> map = new HashMap<>();
//定义一个指针指向head头结点
ListNode cur = head;
//cur遍历整个链表
while (cur != null) {
//如果包含了相同的值,让这个k加1就行
if (map.containsKey(cur.val)) {
map.put(cur.val,map.get(cur.val) + 1);
}else {
//否则的话,就put到map中
map.put(cur.val, 1);
}
//cur指向cur.next
cur = cur.next;
}
//创建虚拟结点node,并让node.next指向head
ListNode node = new ListNode(0);
node.next = head;
//cur指向node结点
cur = node;
/*
cur再次遍历链表
*/
while (cur.next != null) {
//如果存在一个结点的值不为1,那么说明这个结点就是要删除的
if (map.get(cur.next.val) != 1) {
//cur.next改为cur.next.next的地址
cur.next = cur.next.next;
}else {
cur = cur.next;
}
}
//返回虚拟头结点
return node.next;
}
}