题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路分析:
两种思路:
第一种方法不使用递归,设置一个指针让其指向链表的头结点,我们从头节点开始遍历,要删除重复节点就是判断当前节点的值是否和下一个节点值相等,如果是则往下遍历,直到遇到第一个不相等的节点,新的链表头就从该点开始,然后重复上面的操作找到下一个不重复的节点。
第二种方法就是使用递归,思路和上面的一样。
代码:
方法一:
/*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;
if(pHead.next==null)
return pHead;
ListNode first=new ListNode(-1);
first.next=pHead;
ListNode last=first;
ListNode pNode=pHead;
while(pNode!=null&&pNode.next!=null){
if(pNode.val==pNode.next.val){
int val=pNode.val;
while(pNode!=null&&pNode.val==val){ //切记在链表中循环遍历一定要判断当前节点是否为空。
pNode=pNode.next;
}
last.next=pNode;
}else{
last=pNode;
pNode=pNode.next;
}
}
return first.next;
}
}
方法二:
/*
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;
if(pHead.next==null)
return pHead;
if(pHead.val==pHead.next.val){
ListNode pNode=pHead;
int val=pNode.val;
while(pNode!=null&&val==pNode.val){
pNode=pNode.next;
}
return deleteDuplication(pNode); //找到第一个不重复的点开始递归。
}else{
pHead.next=deleteDuplication(pHead.next); //如果当前节点不是重复的保存下来,从下一个节点开始递归。
return pHead;
}
}
}