剑指offer算法题
链表
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题目分析:
1.添加一个头节点,用来解决第一个节点会出现重复的情况。
2.设置 pre ,node指针, pre指针指向当前节点的前一个节点,node指针相当于工作指针,一直往后面搜索。
构造节点的值无所谓是否与第一个节点的值相同,因为比较重复是从原链表的头节点开始进行比较,我们自己构造的节点并不需要参与比较。我们所利用到的只是我们构造节点的.next而已。
也就是说,pre指针始终指向的是当前节点的前一个节点。如果当前节点和下一个节点开始出现重复,由于是排序的链表,则可以将当前节点的值继续和下下个节点的值进行比较,直到找到值不相同的那个节点为止。找到后,使用pre节点,也就是当前节点的前一个节点,指向那个值不相同的节点。即完成了重复节点的删除。
下面是JAVA算法实现:
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead == null || pHead.next == null){
return pHead;
}
ListNode node = pHead;
ListNode head = new ListNode(-1);
head.next = node;
ListNode tmp = null;
ListNode pre = head;
while(node!=null){
//一定要注意判断下一个节点不为空!
if(node.next!=null &&node.val == node.next.val){
tmp = node.next;
while(tmp!=null && node.val == tmp.val){
tmp = tmp.next;
}
pre.next = tmp;
node = tmp;
}else{
pre = pre.next;
node = node.next;
}
}
return head.next;
}