力扣题目
解题思路
java代码
力扣题目:
给定一个已排序的链表的头 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. 主函数 main
- 创建了一个链表,链表元素为 1 -> 1 -> 1 -> 2 -> 3。
- 调用
deleteDuplicates
函数删除链表中的重复元素。 - 遍历并打印修改后的链表。
2. ListNode
类
- 这是一个简单的链表节点类,包含两个属性:
val
(节点值)和next
(指向下一个节点的指针)。
3. 函数 deleteDuplicates
- 参数:链表的头节点
head
。 - 返回值:删除重复元素后的链表的头节点。
4. 函数逻辑
- 首先检查头节点是否为空,如果为空,直接返回
null
。 - 创建一个哑节点(dummy node)并指向头节点,这样即使头节点被删除,我们也能返回正确的链表头。
- 使用
cur
指针遍历链表。 - 在遍历过程中,如果发现
cur.next
和cur.next.next
的值相同,说明有重复元素,那么就继续向后移动cur.next
指针,直到找到一个不同的值。 - 如果
cur.next
和cur.next.next
的值不同,说明当前节点不是重复元素,移动cur
指针到下一个节点。 - 最后返回哑节点的下一个节点,即新的头节点。
java代码:
package org.example.mouth7.today715;
public class Leetcode82 {
public static void main(String[] args) {
ListNode listNode = new ListNode(1);
listNode.next = new ListNode(1);
listNode.next.next = new ListNode(1);
listNode.next.next.next = new ListNode(2);
listNode.next.next.next.next = new ListNode(3);
listNode = deleteDuplicates(listNode);
while (listNode != null){
System.out.println(listNode.val);
listNode = listNode.next;
}
}
public static ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return head;
}
ListNode dummy = new ListNode(0, head);
ListNode cur = dummy;
while (cur.next != null && cur.next.next != null) {
if (cur.next.val == cur.next.next.val) {
int x = cur.next.val;
while (cur.next != null && cur.next.val == x) {
cur.next = cur.next.next;
}
} else {
cur = cur.next;
}
}
return dummy.next;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项