leetcode83_Remove Duplicates from Sorted List

问题描述:

Given a sorted linked list, delete all duplicates such that each element appear only once.

Example 1:

Input: 1->1->2
Output: 1->2

Example 2:

Input: 1->1->2->3->3
Output: 1->2->3

题解:

这道题是经典的双指针问题,用两个指针一前一后指向链表。如果两个指针指向的值相等,那么就让第二个指针一直往后挪,挪到与第一个指针不同为止。然后让第一个指针的next指向第二个指针,两个指针同时往后挪,进行下面的操作。

需要注意处理尾部,当list的结尾几个node是重复的时候,例如1->2->3->3,会出现ptr1=3且ptr2=null,这时需要令ptr1.next=null,否则直接while循环终止,ptr1就没有尾巴了。

其他情况就不用特殊处理结尾了,因为结尾没有重复值,只须遍历就够了,不用特殊处理尾部。 

 

代码如下: 

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null || head.next == null){
            return head;
        } //首先排除空字符串或者只有一位的情况
        ListNode ptr1 = head;//一个节点指向初始节点用来return返回,另外一个节点指向初始节点之后往后扫描继续工作
        ListNode ptr2 = head.next;//双指针的情况,只有一个指针的初始节点与return的初始节点相同,否则无法返回初始节点开始的那个链表;双指针建立了两个链表, ptr1是要返回的那个链表, ptr2是从第二项开始挨个遍历的链表。
        while(ptr2!=null){
            if(ptr1.val == ptr2.val){
                ptr2 = ptr2.next;
                if(ptr2==null)
                    ptr1.next = null;//链表的末尾,是指针为null,而不是内容为null
            }else{
                ptr1.next = ptr2;//不是重复结尾的情况的话,直接链表就指向了ptr1--->ptr1.next = ptr2--->ptr2.next = null
                ptr1 = ptr1.next;
                ptr2 = ptr2.next;
            }
        }

        return head;
    }
}

上一篇:typedef 和 #define 在定义变量时的注意事项


下一篇:Android: java.lang.SecurityException: Permission Denial: starting Intent camera