①题目

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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之间永远都挨在一起,分不开。

    

01-14 22:22
查看更多