**题目:**本题出自力扣第 八十三题删除所有重复的元素,使每个元素只出现一次 。
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。
返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
解法1:有序链表,遇重则跳
分析一下,有序链表取出重复,那重复值肯定是挨着的,因为是有序链表。
既然是挨着的,那就遍历,从第一个开始,先看看下一个值是不是和当前值一样,如果一样,那就直接越过下一个,把当前值指向下一个的下一个,抛弃这个相同值。然后游标不动,继续遍历,要是还相等就继续操作,直到不相等了,游标才往下走。(这里隐含递归思路,目前不做递归处理,后面回来再说。)
最后返回即可。有了思路,代码就巨简单了。
/**
* 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 indexNode = head;
// 遍历开始
while(indexNode.next != null){
// 如果下一个节点的值不等于自己,那就越过下一个,指向下一个的下一个,逐步跳过
if(indexNode.next.val == indexNode.val){
indexNode.next = indexNode.next.next;
}else{
// 否则继续遍历
indexNode = indexNode.next;
}
}
// 最后返回
return head;
}
}
解法2:递归处理
我们看到了上面的分析的时候隐含了递归的操作,等回来我们专门处理递归题型的时候回来再处理。
TODO
总结:
有序就是挨着的,你判断一样跳过就行。