前言:
啊,这道题一看题,感觉好简单的样子,但是做起来真不简单,想了好久。。。。
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题目解析
这道题,我最开始想这个该怎么做呢,首先想到的使用Set来做,先将重复元素放到set中存储,然后在遍历链表删除掉重复的元素,这样方法可以实现,代码量挺多的,并增加了辅助空间。那么有没有更好的方法呢,我就想到了递归。通过递归来找到重复的数字,不重复的保存下来就可以,代码量很少,直接看代码吧。
代码样例
package com.asong.leetcode.deleteDuplicationLsit;
import java.util.LinkedList;
import java.util.Queue;
/**
* 删除链表中重复的结点
* 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,
* 重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
//只有一个结点时 直接返回头结点
if(pHead == null || pHead.next==null)
{
return pHead;
}
if(pHead.val == pHead.next.val)
{
ListNode node = pHead.next;
//继续向下查找是否还有重复的结点
while (node!=null && node.val == pHead.val)
{
node = node.next;
}
//递归查找重复结点
return deleteDuplication(node);
}
else {
pHead.next = deleteDuplication(pHead.next);
return pHead;
}
}
}