82. 删除排序链表中的重复元素 II

简介: 82. 删除排序链表中的重复元素 II

题目



image.png



思考


链表形态


本道题感觉是考验链表的基本知识。

链表形态

image.png

链表是一种存储非连续的存储结构,节点之前由指针链接构成。


相对于数组而言,链表方便增加 和 删除节点,但是对比数组不足的时,没办法做二分查找,因为链表不是通过下标寻址的,而是通过指针寻址的,这也是为什么会出现跳表数据结构,扯远了。。



如何删除节点


假设删除如下 【结点2】

image.png


定义三个指针,分别是 待删结点 / 上结点 和 下结点, 分别指向 结点2/结点1/结点3


image.png


只需要将 上结点 直接指向 下结点,然后将 待删节点删除即可

image.png


回归题目本身


需要删除重复的结点

和上面删除结点如出一辙,只不过有细微修改而已

image.png


如果我们像上图那样,找到上结点 下结点 和 待删除结点 ,这样就能够清理重复结点

我们怎么确定上结点 和 下结点?


只需要上节点的值 和 下节点一致,即可判断需要删除

伪代码

if 链表长度小于2
    直接返回链表
nextNode = head->next
下节点标记值
while (nextNode不等于NULL)
    if (nextNode节点 和 nextNode下一个节点不相等)
        if 下节点标记值
            直接从上节点 跳到 下节点即可
        else
            继续挪动链表
    else
        记录上节点值
        下节点标记值 = True
    nextNode = nextNode->next;
return 处理后的链表


代码提交

func deleteDuplicates(head *ListNode) *ListNode {
  currNode := head
    if currNode == nil {
        return head
    }
  nextNode := head.Next
  failedNode := head
  start := false
  rHead := new(ListNode)
  curr := rHead
  if nextNode == nil {
    return head
  }
  for nextNode != nil {
    if currNode.Val != nextNode.Val {
      if start {
        if failedNode.Val != currNode.Val {
          rNode := new(ListNode)
          rNode.Val = currNode.Val
          curr.Next = rNode
          curr = rNode
        }
      } else {
        rNode := new(ListNode)
        rNode.Val = currNode.Val
        curr.Next = rNode
        curr = rNode
      }
    } else {
      failedNode = currNode
      start = true
    }
    nextNode = nextNode.Next
    currNode = currNode.Next
  }
  if failedNode.Val != currNode.Val {
    rNode := new(ListNode)
    rNode.Val = currNode.Val
    curr.Next = rNode
    curr = rNode
  }
  return rHead.Next
}




难点和复杂点


感觉本题是考验对链表的基本操作


\


解题步骤,可以分为几步


  1. 单链表,如何删除一个节点
  2. 单链表,如何删除连续多个节点
  3. 根据条件(2节点数据相同),如何确认上结点 和 下结点
相关文章
|
24天前
|
算法
数据结构和算法学习记录——习题-移除链表元素
数据结构和算法学习记录——习题-移除链表元素
14 0
|
23天前
|
存储 人工智能 测试技术
每日练习之排序——链表的合并;完全背包—— 兑换零钱
每日练习之排序——链表的合并;完全背包—— 兑换零钱
14 2
|
5天前
|
算法
【数据结构与算法 刷题系列】移除链表元素
【数据结构与算法 刷题系列】移除链表元素
|
20天前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】
|
20天前
|
存储 SQL 算法
LeetCode 题目 82:删除排序链表中的重复元素 II
LeetCode 题目 82:删除排序链表中的重复元素 II
|
25天前
|
存储 NoSQL Redis
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
|
2月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
20天前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
20天前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
25天前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
11 2