博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer(59):删除链表中重复的节点
阅读量:4286 次
发布时间:2019-05-27

本文共 1653 字,大约阅读时间需要 5 分钟。

题目描述

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

分析

从头遍历整个链表,如果当前的节点(pNode)与下一个节点的值相同,则都是重复的节点,可以进行删除。为了保证删除之后的链表中间不断开,需要保存当前节点的前一个节点pPreNode,将其与后面第一个不重复的节点相连。注意,当头结点是重复节点的时候,头结点也会被删除。

牛客AC:

/* public class ListNode {    int val;    ListNode next = null;    ListNode(int val) {        this.val = val;    }}*/public class Solution {
public ListNode deleteDuplication(ListNode pHead) { if(pHead == null) return null; if(pHead.next == null) // 只有一个头结点 return pHead; ListNode pNewHead = pHead; // 返回链表中新的头结点,注意头结点可能也会因重复删除 ListNode pPreNode = null; // 保存遍历当前节点的前一个节点 ListNode pNode = pHead; // 当前节点 while(pNode != null) { ListNode pNext = pNode.next; // 当前节点的后一个节点,判断是否重复 // 后一个节点不为空,值相等,则重复 if(pNext != null && pNode.val == pNext.val) { // 先记录下需要被删除的节点及其值 int val = pNode.val; ListNode pToBeDel = pNode; // 遍历后面的,找到pNext是一个不再重复的节点为止 while(pToBeDel != null && pToBeDel.val == val) { pNext = pToBeDel.next; pToBeDel = pNext; } if(pPreNode == null) // 更新头结点 pNewHead = pNext; else pPreNode.next = pNext; // 修改链表,将pre直接连接到next,则中间的重复节点全部被删除 pNode = pNext; } else { // 否则,往后继续遍历 pPreNode = pNode; pNode = pNode.next; } } return pNewHead; // 返回新的头结点 }}

参考

1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社

转载地址:http://ikxgi.baihongyu.com/

你可能感兴趣的文章
iOS 绘图Quartz2D的内存管理
查看>>
iOS 绘图Quartz2DQ绘制图片和文字
查看>>
iOS 绘图Quartz2d图片裁剪/加水印/截屏
查看>>
iOS touch事件的多点触控案例和获取touch的属性
查看>>
iOS ARC内存管理/strong weak copy assign 的用法与区别(一)
查看>>
iOS NSthread多线程的应用原理与总结
查看>>
iOS GCD多线程的使用
查看>>
iOS NSOperation多线程的使用与理解
查看>>
iOS之屏幕旋转调用的方法
查看>>
iOS之中打电话/发短息/发邮件/吊起QQ聊天的方法总结
查看>>
iOS之UIImageView和UIImage
查看>>
iOS OC原生的输入输出流结合socket实现即时通讯
查看>>
iOS AsynSocket实现即时通讯
查看>>
iOS VFL语言
查看>>
iOS UIPopoverController以及iOS9以后UIPopPresentationController的使用、封装到分类中
查看>>
宏定义
查看>>
OC中字符串的操作
查看>>
ios之NSFileManager文件操作
查看>>
iOS NSThread多线程枷锁
查看>>
ios/OC之调用系统相机录像、拍照、打开相册
查看>>