携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
一、题目描述:
83. 删除排序链表中的重复元素 - 力扣(LeetCode) (leetcode-cn.com)
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
- 链表中节点数目在范围 [0, 300] 内
- -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
二、思路分析:
两种方法:
- 定义指针,遍历整个链表
如果next节点值不为空,将当前值和下一个节点的值进行比较,如果相等 删除next节点 如果不相等,则当前节点指针后移
直到遍历退出循环,返回head节点即可 - 递归的进行遍历。对于head.next节点来说,又相当于删除后续链表的所有重复节点,可以直接进行递归调用
最后,返回值需要先对head和head.next的值进行判断 是否相等
两种方法都需要在开始之前对边界条件进行判断 head和head.next是否为空
三、AC 代码:
/**
* 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 || head.next == null){
// return head;
// }
// // 定义当前指针 用于判断是否和下一个节点值相等
// ListNode currentNode = head;
// while(currentNode.next != null){
// if(currentNode.next.val == currentNode.val){
// currentNode.next = currentNode.next.next;
// }else{
// currentNode = currentNode.next;
// }
// }
// // 循环退出之后 表明当前已经遍历到了最后
// return head;
// 递归方法 每次移动之后就相当于 对于剩余链表进行去重,可以分割成重复的子问题
if(head == null || head.next == null){
return head;
}
// 递归调用,这里直接获取了头结点的next,还没有对head和head.next二者的值进行判断
head.next = deleteDuplicates(head.next);
// 最后需要对头结点进行判断
if(head.val == head.next.val){
return head.next;
}else{
return head;
}
}
}