83. Remove Duplicates from Sorted List

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

For example,

Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.

对于给定排序链表进行去重处理。

1)对于空链表或者只有一个节点的链表不存在重复的问题,故可直接返回。

2)循环条件,当节点为最后一个节点,则无需继续比较了。因为之前的比较是当前节点和后一节点进行的。所以最后一个节点已经参与过比较了。无需继续。

3)若当前节点值等于后一节点值时,为*list赋值下一个节点即可。并及时释放删除节点的内存,防止出现内存泄漏。

4)若值不相等,list指向下个next即可。

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     struct ListNode *next; * }; */struct ListNode* deleteDuplicates(struct ListNode* head) {    if ( head == NULL || head->next == NULL )    {           return head;    }        struct ListNode **list = &head;        while ( (*list)->next != NULL )    {        if ( (*list)->val == (*list)->next->val )        {            struct ListNode *delete = *list;            (*list) = (*list)->next;            free(delete);        }        else        {            list = &(*list)->next;        }    }    return head;}

注:

    1)*list作为头节点出现,表示头节点。

    2)*list作为其他节点时,*list具有两重意思。一是代表当前节点,二是对上一节点next的解引用。故为*list赋值即为给上一节点的next的赋值。