【简单】删除删除排序链表中的重复元素(2道) - 2.22

76 阅读1分钟

题目1

题目链接:

题目简述:

  • 删除所有重复的元素,使每个元素只出现一次

题解:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function (head) {
  let cur = head // 给head创建一个帮手,让他去查找删除,确保最后可以无脑 return head
  // 既然要比较当前结点和下个结点,那么两个结点都必须是有值的
  while (cur !== null && cur.next !== null) {
    if (cur.val === cur.next.val) {
      cur.next = cur.next.next
    } else {
      cur = cur.next
    }
  }
  return head
}

题目2

题目链接:

题目简述:

  • 删除该链表中重复的结点,重复的结点不保留

题解:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function (head) {
  // 极端情况,0,1个结点,直接返回
  if (head === null || head.next === null) {
    return head
  }
  let dummy = new ListNode()
  // dummy 用于固定head,或者说固定链表的头部结点,即时head被删,dummmy.next 一定也是头部结点
  dummy.next = head
  let cur = dummy // cur指针用于更改结点next指向
  while (cur.next && cur.next.next) {
    if (cur.next.val === cur.next.next.val) {
      const val = cur.next.val
      while (cur.next && cur.next.val === val) {
        cur.next = cur.next.next
      }
    } else {
      cur = cur.next
    }
  }
  return dummy.next

总结:

两道题非常相似,可以放到一起总结

相同点:删除重复元素的方法 cur.next = cur.next.next

不同点:

  1. 第1题,重复的结点有一个保留下来的,不需要定义 dummy结点,用当前的结点比对后面的结点,一个个删就好;第2题,重复的结点全部删除,那么就需要有一个前驱结点 dummy

  2. 题目2,将某组重复的结点一次性删除,使用到了while循环