题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。(注意该链表为排序链表,重复的节点不保留哦!)
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
(1)递归
递归的方法就像是先判断第一个节点和之后的节点是否一样,如果一样就删除重复的节点,如果不一样,就把这个节点之后的链表传入递归方法中,依次查找,最后返回链表。
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
if(pHead == null || pHead.next == null)
return pHead;
if(pHead.val == pHead.next.val) { //当前节点开始,节点重复
ListNode pNode = pHead.next;
while(pNode != null && pNode.val == pHead.val)//删除相同的节点
pNode = pNode.next;
return deleteDuplication(pNode); //将之后的节点递归
} else { //当前节点开始,结点不重复
pHead.next = deleteDuplication(pHead.next); //将之后的链表递归
return pHead;
}
}
}
(2)非递归
public 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;//重定pre的next,删除重复的节点
last = last.next;
}else{//无重复节点
pre = pre.next;
last = last.next;
}
}
return Head.next;
}
}