剑指offer(四十三)之删除链表中重复的结点

题目描述

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

代码1:

import java.util.*;
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead == null) return null;
        //定义一个链表,存放所有节点的值
        ArrayList<Integer> list = new ArrayList<Integer>();
        //定义一个头指针
        ListNode p = pHead;
        list.add(p.val);
        while(p.next != null)
        {
            //滑动指针
            p = p.next;
            list.add(p.val);
        }
        //取出存在不重复的值
        ArrayList<Integer> list2 = new ArrayList<Integer>();
        for(int i : list)
        {
            int count = 0;
            for(int j : list)
            {
                if(i == j) count ++;
            }
            if(count == 1) list2.add(i);
        }
        //重建链表
        if(list2.size() == 0) return null;
        ListNode pHead2,p2;
        pHead2 = new ListNode(list2.get(0));
        p2 = pHead2;
        for(int i = 1;i < list2.size();i ++)
        {
            p2.next = new ListNode(list2.get(i));
            p2 = p2.next;
        }
        return pHead2;

    }
}

代码2:

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if (pHead == null) {
            return null;
        }
        ListNode headNode = new ListNode(0);
        headNode.next = pHead;
        ListNode pre = headNode;
        ListNode p = pHead;
        while(p != null && p.next != null){
            if(p.val == p.next.val){
                int temp = p.next.val;
                while(p != null && p.val == temp){
                    p = p.next;
                }
                pre.next = p;
            }else{
                pre = p;
                p = p.next;
            }
        }
        return headNode.next;
    }
}

时间: 2024-10-13 01:13:31

剑指offer(四十三)之删除链表中重复的结点的相关文章

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

删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路 需要两个指针,一个指向前一个节点preNode,另一个指向当前节点node,如果遇到相等的节点,node向后移动,preNode不动,存下node.val方便后面的比较,直到遇到node和node.next不相等,preNode就可以指向node.n

剑指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

剑指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] 56. 删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: class Solution { public: ListNode *deleteDuplication(ListNode *pHead) { if (pHead == NULL || pHead->next == NULL) return pHead; List

删除链表中重复的结点(剑指offer)

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 方法一:递归 两种情况,如果是重复结点怎么办?遇到了就跳过,返回重复节点的下一个结点. 遇到不重复结点?遇到不重复结点直接连上. /* public class ListNode { int val; ListNode next = null; ListNode(int val

剑指offer:删除链表中重复的结点

题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路分析: 要考虑两种情况,链表中结点为0或1,此时直接返回原链表:第二种情况就是链表中包含两个及以上的结点. 解决第一种情况直接进行一个判断即可,第二种情况,需要定义三个指针pre, cur, nex来解决.其中为了最终返回链表头指针,需要额外定义一个指针,指向链表头.这里

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

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题解: 这道题没什么讲的,注意指向空的边界就行,新建一个头节点更容易处理. 1 class Solution { 2 public: 3 ListNode* deleteDuplication(ListNode* pHead) { 4 if (pHead == nullptr

剑指offer56:删除链表中重复的结点,排序的链表中,删除重复的结点不保留,返回链表头指针。 例如,链表1-&gt;2-&gt;3-&gt;3-&gt;4-&gt;4-&gt;5 处理后为 1-&gt;2-&gt;5

1 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 2 思路和方法 (1)链表为空,不必多说,return NULL: (2)如果恰恰是头结点与头结点的后一个重复了,这种情况是可以发生的,那头结点就要被删除,另选新的结点作为头结点.如何处理这种特殊情况,多申请一个指针就可以了. 3 C++核心代码 1 /* 2 struct

剑指Offer-56.删除链表中重复的结点(C++/Java)

题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 分析: 递归思路,如果当前结点和它的next结点的val值不同,则当前结点可以直接接到已处理完的结点后,继续删除重复的过程:如果当前结点和它的next结点的val值相同,则需要继续遍历,直到找到一个与当前结点val不同的结点作为新链表的头结点,如果找不到,说明链表所有结点元素都一