目录
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
这是一道标星为简单的题,难度不是很大。需要注意的几点是:
public static ListNode deleteDuplicates(ListNode head){
//已排序的链表
ListNode currNode = head;
//如果后一值和前一值相等,前一值的next指向后一值的next
while(currNode!=null&&currNode.next!=null){
if(currNode.val==currNode.next.val){
currNode.next = currNode.next.next;
}else{
//不相等的情况,就让前指针向后移
currNode = currNode.next;
}
}
return head;
}
删除链表中等于给定值val的所有节点。
我的初步想法是:
当然,我并没有考虑要删除的多个元素都出现在头节点的情况,如果考虑这点,哨兵节点的好处就体现出来了。
当要删除的一个或多个节点位于链表的头部时,可以利用哨兵节点,使链表标准化,即使链表永不为空,永不无头,简化插入和删除的操作。
ListNode sentinel = new ListNode(0);
sentinel.next = head;
public ListNode sentinelRemove(ListNode head,int val){
//创建哨兵节点,指向head
ListNode sentinel = new ListNode(0);
sentinel.next = head;
//定义两个指针,前向指向哨兵节点,当前指向head
ListNode prev = sentinel;
ListNode curr = head;
while(curr!=null){
if(curr.val == val){
//当前节点值就是指定值,则让上一个节点的next指向下一个节点
prev.next = curr.next;
}else{
//上一个节点向后移
prev = curr;
}
//遍历下一节点
curr = curr.next;
}
//返回哨兵节点的下一节点
return sentinel.next;
}
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
同样是删除链表中的重复元素,第一道题是保留一个即可,这个题的意思就是一个不留。需要注意的是:
这道题,我们还是可以利用哨兵节点:
public ListNode deleteDuplicates(ListNode head) {
//创建哨兵节点,指向head
ListNode sentinel = new ListNode(0);
sentinel.next = head;
ListNode prev = sentinel,curr = head;
//当前位置且下一位置都不为空
while(curr!=null&&curr.next!=null){
//如果下一位和这位重复
if(curr.val == curr.next.val){
//向后寻找,知道curr为不重复的元素
int val = curr.val;
while(curr!=null&&curr.val==val){
curr = curr.next;
}
//删去重复元素
prev.next = curr;
}else{
//不重复的情况
//两个指针分别向后移动
prev = curr;
curr = curr.next;
}
}
return sentinel.next;
}
原文:https://www.cnblogs.com/summerday152/p/12215734.html