题目
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
分析
由题可知:在链表中有相同值的节点是相邻的
解法一:递归
1、终止条件:为空
2、应该返回的值:当前链表头节点
3、递归的每一步在干嘛(【误区】不要想压栈,每一个栈在干嘛):判断相邻节点是否相等,相等直接指向下一个
解法二:迭代(能递归必能迭代)
循环迭代,判断相邻节点是否重复
/**
* 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) {
// 解法一:递归
// return deleteDuplicates01(head);
// 方法二:迭代法
return deleteDuplicates02(head);
}
/**
解法一:使用递归的方法
*/
private static ListNode deleteDuplicates01(ListNode head){
if(head==null||head.next==null){
return head;
}
// 递归每一步要干什么
head.next=deleteDuplicates01(head.next);
if(head.val==head.next.val){
// 当前头节点指向,头节点的下一个位置
head=head.next;
}
return head;
}
/**
解法二:迭代
*/
private static ListNode deleteDuplicates02(ListNode head){
// 定义一个指针
ListNode p=head;
while(p!=null&&p.next!=null){
if(p.val==p.next.val){
// 前后节点相等
// 将前一个节点的后后两个节点进行赋值
// 这个时候不需要指针后移,他要继续重当前节点去遍历
p.next=p.next.next;
}else{
p=p.next;
}
}
return head;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/96232.html