剑指Offer:删除链表的节点【18】

剑指Offer:删除链表的节点【18】

题目描述

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

题目分析

  

  如上图所示,我们的定义了三个指针,其中第二、三个指针用于找到重复元素的第一个位置和最后一个位置的下一个位置,然后第一个指针的下一个指向三个指针,这样就跳过了重复元素。

但是编码发现后,还有两种情况欠考虑。

  

  这种情况,刚开始,就是重复,那第一个指针直接指向最后一个指针,所以返回的时候不能直接返回pHead了,因为那样子的话,就相当于没有删除。当然还有一种情况就是重复元素直接到最后一个元素

  

  这时候我们需要处理一个边界问题,如果第三个指针的下一个为空,说明他已经是最后一个元素了,它与第二个指针之前的元素都是重复元素,都应该删除,所以我们直接让第一个指针指向空即可!

Java题解

package linklist;

import java.util.Scanner;

public class DeleteDuplication {
    public static void main(String[] args) {
        ListNode a1 = new ListNode(1);
        ListNode a2 = new ListNode(1);
        ListNode a3 = new ListNode(1);
        ListNode a4 = new ListNode(1);
        ListNode a5 = new ListNode(1);
        ListNode a6 = new ListNode(1);
        ListNode a7 = new ListNode(1);
        a1.next=a2;
        a2.next=a3;
        a3.next=a4;
        a4.next=a5;
        a5.next=a6;
        a6.next=a7;
        deleteDuplication(a1);
    }

    public static ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead==null)
            return null;
        ListNode pA = new ListNode(0);
        pA.next = pHead;
        ListNode pB = pHead;
        ListNode pC =pHead.next;

        ListNode start = pA;

        while (pC!=null)
        {
            if(pC.val!=pB.val)
            {
                pA=pA.next;
                pB=pB.next;
                pC=pC.next;
            }else {
                while (pC!=null&&pC.val == pB.val) {
                    pC = pC.next; //直到找到相等为止
                }
                pA.next = pC;
                pB =pC;
                if(pC==null)
                    break;
                pC=pC.next;
            }
        }
        start=start.next;
        while (start!=null)
        {
            System.out.println(start.val);
            start=start.next;
        }
        return null;
    }
}

  

原文地址:https://www.cnblogs.com/MrSaver/p/9280166.html

时间: 2024-07-28 23:30:03

剑指Offer:删除链表的节点【18】的相关文章

剑指Offer——删除链表中重复的结点

题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 分析: 因为已经排好序了,所以如果相邻的数值一样的话,那么就跳过该数值,不过要记录前一结点的指针,将其next指向后一个没有重复的结点. 代码: 1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 Li

剑指offer (5) 链表插入删除

我们在操作链表的时候,必须注意以下事项: 1. 链表指针为NULL的情况 2. 插入删除涉及到 链表第一个节点时,需要修改 链表的第一个节点: a. 因为 c语言都是传值的,如果需要修改一个变量,就必须通过 指向该变量的指针(即该变量的地址) 例如:例如 修改 int a,则输入参数必须是 int* a, 修改a 则是: *a = b; (b为int) 我们需要修改一个指针时,就必须通过 该指针的地址,也就是 指向该指针的指针,即二级指针 例如  修改 int* a, 则输入参数必须是 int*

【剑指offer】链表倒数第k个节点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25662121 在Cracking the Code Interview上做过了一次,这次在九度OJ上测试,AC. 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的

剑指offer之链表

//剑指offer 之 链表 //面试题6 从尾到头打印链表 /***************************************************************************************** 问题描述: 输入一个链表的头节点,从尾到头反过来打印出每个节点的值 链表节点定义如下: struct ListNode{ int m_nValue; ListNode* m_pNext; }; *******************************

剑指offer-18-2. 删除链表中重复的结点

剑指offer-18-2. 删除链表中重复的结点 链表 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: 采用递归的方法查找从头节点开始重复的节点 如果没有重复节点,pHead.next指向deleteDuplication(pHead.next)返回的pHead.next本身 如果有重复节点则pHead.next指向pHead

【Java】 剑指offer(22) 链表中倒数第k个结点

正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始它们的值依次是1.2.3.4.5.6.这个链表的倒数第3个结点是值为4的结点. 思路 第一直觉是先从头开始遍历,计算链表个数n,然后重新遍历,第n-k+1个结点即为所需要的结点.但是需要遍历2次.后面采用了栈进行实现该

剑指Offer(链表)-删除链表中重复的节点

(删除链表中重复的节点)题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路:这里的重复的节点不保留是将只要重复了的节点都要删除掉,所以考虑利用哈希set的方法,先进行重复性的判断,将重复的元素加入到哈希set中去,然后将重复的元素删除. 利用到了两个指针pre和cur,来表示前一个节点和当前节点. /* public

剑指offer 复杂链表的复制

题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路:要进行深拷贝,需要每次都new一个节点出来,利用unordered_map, 2.3 138. Copy List with Random Pointer https://leetcode.com/problems/copy-list-with-random-poi

两个链表的第一个公共结点(剑指offer)+链表

两个链表的第一个公共结点 参与人数:1171时间限制:1秒空间限制:32768K 通过比例:31.25% 最佳记录:0 ms|0K(来自  running) 题目描述 输入两个链表,找出它们的第一个公共结点. 链接:http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

剑指OFFER之链表中倒数第k个节点(九度OJ1517)

题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为两个整数n和k(0<=n<=1000, 0<=k<=1000):n代表将要输入的链表元素的个数,k代表要查询倒数第几个的元素.输入的第二行包括n个数t(1<=t<=1000000):代表链表中的元素. 输出: 对应每个测试案例,若有结果,输出相应的查找结果.否则,输出NULL. 样例输入: 5 2 1