一、题目描述
二、思路分析
2.1 分析
因为链表是有序的,重复的节点的值必然是连续的,所以我们只关心相邻的两个节点的值是不是重复的。定义一个 cur 指针,指向链表的头节点。如果 cur.val 与 cur.next.val 相等(),那么让 cur.next 指向它的下一个节点的下一个 cur.next.next。否则 cur 后移一下,直到 cur 或者 cur.next 为空时。相同的思路实现还有递归版本。一直对递归畏惧,直到看到了题解里一个大佬留下的博客,终于对递归有点感觉了。注意一下链表为空或者只有一个节点的时候。
2.2 图解
三、题解
删除排序链表中重复元素的实现
- 迭代
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode cur = head;
while (cur != null && cur.next != null) {
if (cur.val == cur.next.val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return head;
}
}
- 递归
class Solution {
public ListNode deleteDuplicates(ListNode head) {
// 1.递归的终止条件
if (head == null || head.next == null) {
return head;
}
// 2.找返回值:应该给上一级返回的信息
head.next = deleteDuplicates(head.next);
// 3.本级递归应该做什么
if (head.val == head.next.val) {
head.next = head.next.next;
}
return head;
}
}