题型1 删除重复的节点,重复的节点不保留
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
需要考虑第一个节点重复的情况,所以创建一个头节点,保证头节点不会重复,头节点指向head,
两个指针,pre 和current 代表前一个节点和当前节点
利用一个标记 duplicate标记重复
循环判断条件:current不为空,循环判断current.val==current.next.val,duplicate=true,current后移
当duplicate为true,pre.next=current.next;为False,pre=next
current后移 current=current.next
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplication(self, pHead):
# write code here
first=ListNode(-1) #创建头节点
first.next=pHead
pre=first #前一个节点指向头节点
current=pHead
while current!=None:
duplicate=False
while current.next!=None and current.val==current.next.val:
current=current.next
duplicate=True
if duplicate==True:
pre.next=current.next
else:
pre=current
current=current.next
return first.next #相当于新的head
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
ListNode first=new ListNode(-1);
first.next=pHead;
ListNode pre=first;//指向当前确定不重复的节点
ListNode cur=pHead;//当前节点,遍历
while(cur!=null){
boolean duplicate=false;
while(cur.next!=null && cur.val==cur.next.val){
cur=cur.next;
duplicate=true;
}
if (duplicate==true) pre.next=cur.next;
else pre=cur;
cur=cur.next;
}
return first.next;
题型2:删除重复节点,留一个
pre 和current,
循环条件:current不为空 pre=current,current=current.next
当current.next!=None pre.val==current.val:
删除current :pre.next=current.next,current后移
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteDuplication(self, pHead):
current=pHead
pre=None
while current!=None:
while current.next!=None and pre.val==current.val:#当前值与前一个相等,删除当前
pre.next=current.next
current=current.next
pre=current
current=current.next
return pHead