zoukankan      html  css  js  c++  java
  • 剑指offer-删除链表中重复的结点

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
    链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
    来源:牛客网
    
    if (pHead==null || pHead.next==null){return pHead;}
    ListNode Head = new ListNode(0);
    Head.next = pHead;
    ListNode pre  = Head;
    ListNode last = Head.next;
    while (last!=null){
        if(last.next!=null && last.val == last.next.val){
            // 找到最后的一个相同节点
            while (last.next!=null && last.val == last.next.val){
                last = last.next;
            }
            pre.next = last.next;
            last = last.next;
        }else{
            pre = pre.next;
            last = last.next;
        }
    }
    return Head.next;
    链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
    来源:牛客网
    
    public static ListNode deleteDuplication(ListNode pHead) {
             
            ListNode first = new ListNode(-1);//设置一个trick
     
            first.next = pHead;
     
            ListNode p = pHead;
            ListNode last = first;
            while (p != null && p.next != null) {
                if (p.val == p.next.val) {
                    int val = p.val;
                    while (p!= null&&p.val == val)
                        p = p.next;
                    last.next = p;
                } else {
                    last = p;
                    p = p.next;
                }
            }
            return first.next;
        }
    链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
    来源:牛客网
    
    public class Solution {
        public ListNode deleteDuplication(ListNode pHead) {
            if (pHead == null || pHead.next == null) { // 只有0个或1个结点,则返回
                return pHead;
            }
            if (pHead.val == pHead.next.val) { // 当前结点是重复结点
                ListNode pNode = pHead.next;
                while (pNode != null && pNode.val == pHead.val) {
                    // 跳过值与当前结点相同的全部结点,找到第一个与当前结点不同的结点
                    pNode = pNode.next;
                }
                return deleteDuplication(pNode); // 从第一个与当前结点不同的结点开始递归
            } else { // 当前结点不是重复结点
                pHead.next = deleteDuplication(pHead.next); // 保留当前结点,从下一个结点开始递归
                return pHead;
            }
        }
    }

    /*
    作者:牛客396545268号
    链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
    来源:牛客网

    pHead.next = deleteDuplication(pHead.next); 实参pHead.next表示将当前节点与下一节点不同,
    所以要将下一节点放入递归程序去参加下一轮的比较,这样就将pHead保留了下来。
    返回值给pHead.next表示deleteDuplication返回了一个无重复的节点,所以要让当前节点指向它。
    */
  • 相关阅读:
    SCSI contrller的几种类型的区别
    ScaleIO与XtremSW Cache如何集成呢?
    如何强制使用某一大小的包去ping某个IP地址?
    如何查看ETW Trace?
    图像卷积与滤波的一些知识点(转)
    tensorflow serving 编写配置文件platform_config_file的方法
    python在linux的报错集锦
    某些数组和字符串类型转换(转)
    系统安装-007 CentOS7yum源添加、删除及其yum优化(转)
    Error:Failed to resolve: android.arch.core:common:1.1.0
  • 原文地址:https://www.cnblogs.com/Roni-i/p/10370366.html
Copyright © 2011-2022 走看看