目录java
给定一个排序链表,删除全部重复的元素,使得每一个元素只出现一次。指针
这是一道标星为简单的题,难度不是很大。须要注意的几点是:code
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的全部节点。排序
个人初步想法是:element
固然,我并无考虑要删除的多个元素都出如今头节点的状况,若是考虑这点,哨兵节点的好处就体现出来了。leetcode
当要删除的一个或多个节点位于链表的头部时,能够利用哨兵节点,使链表标准化,即便链表永不为空,永不无头,简化插入和删除的操做。rem
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; }
给定一个排序链表,删除全部含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。get
一样是删除链表中的重复元素,第一道题是保留一个便可,这个题的意思就是一个不留。须要注意的是:it
这道题,咱们仍是能够利用哨兵节点:io
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; }