剑指offer 删除链表中的重复结点
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路:一开始我审错题了以为是没有排序的,想用hashmap来写,哈哈哈。这题有个很关键的点是如果头结点就是重复的会出大问题。最简单的办法是建一个头结点指向他,这就可以避免第一个结点是重复的了。总共需要建三个节点,一个是头结点head,一个当前的不重复元素的节点pre,一个是工作节点last。
当last和last.next的值重复时,就一直找找到最后一个重复的节点。pre.next=last.next;因为在的last是指向该值最后一个重复的节点,所以pre.next要指向last.next.
/*
public class ListNode
{
public int val;
public ListNode next;
public ListNode (int x)
{
val = x;
}
}*/
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;
last=last.next;
}else{
pre=pre.next;
last=last.next;
}
}
return head.next;
}
}
剑指offer中的解法:
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;
ListNode preNode=null;
ListNode node = pHead;
while(node!=null){
ListNode nextnode = node.next;
boolean needDelete = false;
if(nextnode!=null&&nextnode.val==node.val){
needDelete = true;
}
if(needDelete==false){
preNode = node;
node = node.next;
}else{
int val = node.val;
ListNode delnode = node;
while(delnode!=null&&delnode.val==val){
nextnode=delnode.next;
delnode=null;
delnode=nextnode;
}
if(preNode==null){
pHead = nextnode;
}else {
preNode.next = nextnode;
}
node=nextnode;
}
}
return pHead;
}
}