【链表】【打卡第142道】:《剑指Offer》3刷:JZ76 删除链表中重复的结点

1、题目描述

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

数据范围:链表长度满足  ,链表中的值满足 

进阶:空间复杂度  ,时间复杂度 

例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:

 

2、算法分析

题目中要求的是删除链表中重复的元素。

比如:1-2-2-3-4-4-5,删除后:1-3-5

首先定义一个新的链表first,指向的pHead:first.next = pHead;

定义pre 指向新链表的first,用于指向新的链表中的结点

定义current指针指向的是pHead结点

接着判断

①当前结点不为空,接着看下一个结点

②判断下一个结点不为空,且当前结点等于当前结点的下一个结点

③当前结点和当前结点的下一个结点不相等。那么链接下一个结点。

具体看代码。

/*
 public class ListNode {
    int val;
    ListNode next = null;
 
    ListNode(int val) {
        this.val = val;
    }
}
*/
import java.util.*;
public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        // 判断当前结点或者当前结点的下一个结点是否为空
        if(pHead == null || pHead.next == null){
            return pHead;
        }
        // 定义一个空链表
        ListNode first = new ListNode(0);
        first.next = pHead;
        // 定义当前结点
        ListNode pre = first;
        ListNode currentNode =  pHead;
        // 当前结点不为空,那就看下一个结点
        while(currentNode != null){
            // 判断下一个结点不为空且当前结点值和下一个节点值相等
            if(currentNode.next != null && currentNode.val == currentNode.next.val){
                // 多个结点值得处理
                while(currentNode.next != null && currentNode.val == currentNode.next.val){
                    currentNode = currentNode.next;
                }
                // 到重复元素得最后一个结点的位置
                pre.next = currentNode.next;
                currentNode = currentNode.next;
            }else{
                currentNode = currentNode.next;
                pre = pre.next;
            }
        }
        return first.next;
    }
}

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/121733480