83. 删除排序链表中的重复元素
题目描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
解题思路
1、因为链表是有序的,所以重复元素一定相邻。
2、遍历链表,如果发现当前元素和下个元素值相同,就删除下个元素值
3、遍历结束后,返回原链表的头部
代码实现
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode node = head;
while(node!=null && node.next != null){
if(node.next.val == node.val){
node.next = node.next.next;
}else{
node = node.next;
}
}
return head;
}
}
82. 删除排序链表中的重复元素 II
题目描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
解题思路
1.如果链表为空,或者只有一个节点,直接返回
2.如果链表节点大于等于2,则比较当前节点和下一个节点是否相同,如果相同,则删除当前节点和下一个节点,比较下下个节点是否和当前节点相同,如果相同继续删除,直至与当前节点不同。
3.返回链表表头是第一个不重复节点,需要一个前驱结点prenode记录不重复链表,其next应该初始化为null,如果有下一个不重复结点,则next是下一个不重复结点
代码实现
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return null;
}
ListNode preNode = null;
ListNode node = head;
while (node != null) {
if (node.next != null && node.val == node.next.val) {
int value = node.val;
while (node.next != null && node.next.val == value) {
node = node.next;
}
if (preNode == null) {
head = node.next;
} else {
preNode.next = node.next;
}
} else {
preNode = node;
}
node = node.next;
}
return head;
}
}