删除链表中的重复结点

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

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

思路:一开始我审错题了以为是没有排序的,想用hashmap来写,哈哈哈。这题有个很关键的点是如果头结点就是重复的会出大问题。最简单的办法是建一个头结点指向他,这就可以避免第一个结点是重复的了。总共需要建三个节点,一个是头结点head,一个当前的不重复元素的节点pre,一个是工作节点last。
当last和last.next的值重复时,就一直找找到最后一个重复的节点。pre.next=last.next;因为在的last是指向该值最后一个重复的节点,所以pre.next要指向last.next.

/*
public class ListNode
{
    public int val;
    public ListNode next;
    public ListNode (int x)
    {
        val = x;
    }
}*/
class Solution
{
    public ListNode deleteDuplication(ListNode pHead)
        {
         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;
        }
}

剑指offer中的解法:

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;
         ListNode preNode=null;
         ListNode node = pHead;
         while(node!=null){
             ListNode nextnode = node.next;
             boolean needDelete = false;
             if(nextnode!=null&&nextnode.val==node.val){
                 needDelete = true;
             }
             if(needDelete==false){
                 preNode = node;
                 node = node.next;
             }else{
                 int val = node.val;
                 ListNode delnode = node;
                 while(delnode!=null&&delnode.val==val){
                     nextnode=delnode.next;
                     delnode=null;
                     delnode=nextnode;
                 }
                 if(preNode==null){
                     pHead = nextnode;
                 }else {
                     preNode.next = nextnode;
                 }
                 node=nextnode;
             }
         }
         return  pHead;           
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值