前言
文章目录
83、删除链表中的重复元素
🔊问题描述
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
🏀示例一
输入:head = [1,1,2]
输出:[1,2]
🏀示例二
输入:head = [1,1,2,3,3]
输出:[1,2,3]
👓提示
- 链表中节点数目在范围 [0, 300] 内
- -100 <= Node.val <= 100
- 题目数据保证链表已经按升序排列
🥇代码示例
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null){
return head;
}
// 其实就是新建了一个新的链表结点指向了头节点
ListNode list = new ListNode(0,head);
// 将这个结点指向新建立结点的下一节点,也就是题中所给的头节点
ListNode firstNode = list;
// 加这个判断说明链表还没到头
while(firstNode.next != null && firstNode.next.next != null){
// 如果是第一个元素(即是链头元素)==第二个元素
if(firstNode.next.val == firstNode.next.next.val){
// 将第一个相等的元素存储起来,因为可能相等的不止两个数
int temp = firstNode.next.val;
// 此题相比较82题的基础,在循环判断条件上就多加了.next,就起到了保护一个重复元素的作用
while(firstNode.next.next != null && firstNode.next.next.val == temp){
// 如果下一个元素的值还是与其相等的话,直接再次指向下一个给结点然后进行判断
firstNode.next = firstNode.next.next;
}
}else{
// 改变firstNode的位置,而不是将其next指向下一个next,前者是改变结点位置,后者是将中间的元素进行删除的操作。
firstNode = firstNode.next;
}
}
// list是空的结点,返回从头指针开始,即是list.next
return list.next;
}