①题目
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
②分析,这个题目,跟leetcode里的203题不一样,这个题目是把重复的都删掉,1个不留,而leetcode里的203题是把重复的删了,但是留1个,比如两个1,留下1个1。
③代码
我自己写了1个小时,没做出来,因为老是出现索引越界的问题。看的别人的代码,如下:
1 public class Solution { 2 public ListNode deleteDuplication(ListNode pHead){ 3 if (pHead==null || pHead.next==null){ 4 return pHead; 5 } 6 ListNode Head = new ListNode(0); 7 Head.next = pHead; 8 ListNode pre = Head; 9 ListNode last = Head.next; 10 while (last!=null){ 11 if(last.next!=null && last.val == last.next.val){ 12 // 找到最后的一个相同节点 13 while (last.next!=null && last.val == last.next.val){//这一句有效的避免了索引越界,先保证last.next不为空,再把last.next拿来用。 14 last = last.next; 15 } 16 pre.next = last.next; 17 last = last.next; 18 }else{ 19 pre = pre.next; 20 last = last.next; 21 } 22 } 23 return Head.next; 24 } 25 }
④这个代码的思路就是,
1. 首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况
2.设置 pre ,last 指针, pre指针指向当前确定不重复的那个节点,而last指针相当于工作指针,一直往后面搜索。
⑤学到的知识:
指针要把用处给分开,比如,谁当工作指针,谁当标记指针。比如我该把上述的pre作为标记指针,把last作为工作指针。用两个指针,那么他们就可以分开很远,而如果只用一个指针,比如curr跟curr.next之间永远都挨在一起,分不开。