【剑指offer】056-删除链表中重复的结点

题目

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

方法

方法一:新增前驱结点
方法二:递归
参考:https://suixinblog.cn/2019/02/target-offer-linked-list-remove-repetition.html

方法一

思路

首先在链表的首部前加一个前驱节点,为了判断头节点是否重复
使用两个指针,current和prev,分别指向当前节点,和当前节点的前驱节点
判断当前节点和下一个节点是否相等,相等则需要做删除处理,将重复节点删除,此时就需要用current指针的前驱节点prev指针了
因为同一个数值的重复节点可能不止两个,所以需要在判断相等后,循环找到所有相等节点一起删除

注意:删除一组相等节点后,current指针和prev指针不可以马上移动,因为删除了一组相等节点,当前位置可能接上了新的相等节点

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
function deleteDuplication (pHead{
  // write code here
  if (!pHead || !pHead.next) return pHead
  let newHead = new ListNode('head')
  newHead.next = pHead
  let p1 = newHead
  let p2 = newHead.next
  while (p1 && p2) {
    if (!p2.next) break
    if (p1.next.val === p2.next.val) {
      while (p2.next && p2.next.val === p1.next.val) {
        p2 = p2.next
      }
      p1.next = p2.next
      p2 = p1.next
      continue
    }
    p1 = p2
    p2 = p2.next
  }
  return newHead.next
}
文章作者: ptp
文章链接: https://youyingjie114.github.io/2019/11/07/jz-offer/jz-offer-056/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PTP'S BLOG