leetcode第83题,删除排序链表中的重复元素。采用指针指向越过下一个结点的算法来完成。

LeetCode 83删除排序链表中的重复元素

给定一个已排序的链表的头 head删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表

示例 1:

1输入:head = [1,1,2]
2输出:[1,2]

示例 2:

1输入:head = [1,1,2,3,3]
2输出:[1,2,3]

提示:

  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

思路

  1. 在一条链表中,如果当前节点值和结点下一个值相等,说明下一个结点是重复的
  2. 当前结点越过当前结点的下一个结点,指向当前结点的下下的结点。
  3. 后续的结点也通过同样的方式去判定,直到达到链表尾部

解题

 1/**
 2 * Definition for singly-linked list.
 3 * public class ListNode {
 4 *     int val;
 5 *     ListNode next;
 6 *     ListNode() {}
 7 *     ListNode(int val) { this.val = val; }
 8 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9 * }
10 */
11class Solution {
12    public ListNode deleteDuplicates(ListNode head) {
13        if(null == head) return null;
14        ListNode currentNode = head;
15        while(null != currentNode && null != currentNode.next)
16        {
17            if(currentNode.val == currentNode.next.val)
18            {
19                //存在相同的需要继续判断
20                currentNode.next = currentNode.next.next;
21            }else{
22                currentNode = currentNode.next;
23            }
24            
25        }
26        return head;
27    }
28}

也可以使用递归的操作

  1. 在一条链表中,如果当前节点值和结点下一个值相等,说明下一个结点是重复的
  2. 当前结点越过当前结点的下一个结点,实际上转化成去掉一个结点的链表的删除重复元素的问题
  3. 递归删除,直到达到链表尾部
 1/**
 2 * Definition for singly-linked list.
 3 * public class ListNode {
 4 *     int val;
 5 *     ListNode next;
 6 *     ListNode() {}
 7 *     ListNode(int val) { this.val = val; }
 8 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9 * }
10 */
11class Solution {
12    public ListNode deleteDuplicates(ListNode head) {
13        if(null == head || null == head.next) return head;
14        head.next = deleteDuplicates(head.next);
15        if(head.next.val == head.val)
16        {
17            return head.next;
18        }else
19        {
20            return head;
21        }
22        
23    }
24}