存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3]
输出:[2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
解法1:
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return null;
}
ListNode result = null;
ListNode i = null;
ListNode currentValue = null;
boolean isREpert = false;
ListNode node = head;
while (node != null) {
if (currentValue == null) {
currentValue = node;
node = node.next;
continue;
} else {
if (currentValue.val == node.val) {
isREpert = true;
node = node.next;
continue;
} else {
if (isREpert) {
currentValue = null;
isREpert = false;
continue;
} else {
if (result == null) {
result = i = currentValue;
currentValue = null;
isREpert = false;
continue;
} else {
i.next = currentValue;
i = currentValue;
currentValue = null;
isREpert = false;
continue;
}
}
}
}
}
if (currentValue != null && !isREpert) {
if (result == null) {
result = i = currentValue;
} else {
i.next = currentValue;
i = currentValue;
}
}
if (i != null) {
i.next = null;
}
return result;
}
}
这个时间方案,写了太多的if/else,自己写完之后,立刻看,都不知道对应的if/else是为什么这么做的
解法2:
方案2:
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public class Solution {
/**
* 将问题简化:
* 判断头是否重复
* 1.重复:去掉头部分,对于头之外的部分,递归使用本函数;
* 举例:1 --> 1 --> 1 --> 2 --> 3 头重复的情况,去掉所有的的节点1 ,用剩余的部分2,3调用本函数
* 2.不重复:对于头之外的部分,递归使用本函数,结果作为头的子节点
* 举例:1 --> 2 --> 3 ;头不重复,使用2,3调用本函数,作为1的子节点
*/
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode next = head.next;
if (head.val == next.val) {
while (next != null && next.val == head.val) {
next = next.next;
}
head = deleteDuplicates(next);
} else {
head.next = deleteDuplicates(next);
}
return head;
}
}
结论:
1.尽量避免多层的if/else语句,非常难读懂代码
2.将文件尽量划归为多个重复的简单问题 重复、简单
3.对重复的、简单的问题进行处理,计算机就是和对重复、简单的问题做处理