剑指offer 56.删除有序链表中的重复结点
56. 删除有序链表中的重复结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
分析
借助辅助头结点,可避免单独讨论头结点的情况。设置两个结点 pre 和 cur,当 cur 和 cur.next 值相等,cur 一直向前走,直到不等退出循环,这时候 cur 指的值还是重复值,调整 cur 和 pre 的指针再次判断
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } */
1 public class Solution { 2 public ListNode deleteDuplication(ListNode pHead) 3 { 4 if(pHead == null || pHead.next == null){ 5 return pHead; 6 } 7 8 // 每访问一个结点,循环判断是否重复 9 ListNode cur = pHead; // 指向当前结点 10 // 创建一个辅助头结点,指向前一个元素的指针,方便删除 11 ListNode head = new ListNode(Integer.MIN_VALUE); 12 head.next = pHead; 13 ListNode pre = head; 14 15 while(cur != null){ 16 if(cur.next != null && cur.val == cur.next.val){ 17 // 如果重复,一直后移,直到找到不相等的结点 18 while(cur.next != null && cur.val == cur.next.val){ 19 cur = cur.next; 20 } 21 cur = cur.next; // 这个cur所指结点即是下一个不重复的结点 22 pre.next = cur; 23 }else{ 24 pre= cur; 25 cur = cur.next; 26 } 27 } 28 return head.next; 29 } 30 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现