WHCSRL 技术网

LeetCode 83. 去除排序列表中的重复元素

<块引用>

到目前为止,我已经写了 600 多个算法问题,其中一些已被整理成 pdf 文档。 目前一共1000多页(还会继续增加),可以免费下载
下载链接字体>:https://pan.baidu.com/s/ 1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666


这道题是说链表中的值是按照升序排序的。既然是排序的,那么同一个节点肯定是在我们可以使用一个指针cur,每次都要判断后面的节点的值是否相同,如果相同,则删除后面的节点。这里我们以例2为例看一个视频。结果,强视频 fb42717ccc35f86a7d7b34bab48e0bfcd7871f5a4f0317dd82#177f32e64f&#强>CN

最后看代码

public  ListNode deleteDuplicates(ListNode head) {
    //如果前一个节点为空或者单个节点,直接返回
    if (head == null || head.next ==  null)
        返回 head;
    //只使用指针cur指向当前节点
    ListNode cur = head;
    while (cur.next != null) {
        //如果当前节点的值与下一个节点的值相同,
        //只删除下一个节点值
        if (cur.val == cur.next.val)  {
            cur.next = cur.next.next;
        } else {
            //否则cur会后退一步
            cur = cur.next;
        }
    }
    返回 head;
}
  • 1
  • 2
  • 3
  • 4< /li>
  • 5
  • 6
  • < li style="color: rgb(153, 153, 153);">7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • li> li>
  • 18

递归解决方案

除了使用上面的指针,我们还可以使用递归的方式来解决
public ListNode deleteDuplicates(ListNode head) { //递归边界条件判断 if (head == null || head.next == null) 返回 head; //递归,相当于从后向前遍历 head.next = deleteDuplicates(head.next);跨度> 跨度> //如果当前节点与下一个节点相同,则直接返回下一个节点,否则 //返回当前节点 return head.val == head.next.val ? head .next : head; }

  • 1
  • 2
  • 3
  • 4< /li>
  • 5
  • 6
  • < li style="color: rgb(153, 153, 153);">7
  • 8
  • 9
  • 10
推荐阅读