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;
}
}