Leetcode 203. Remove Linked List Elements

来源:互联网 发布:java jlabel 图片 编辑:程序博客网 时间:2024/06/11 15:14

Remove all elements from a linked list of integers that have value val.

Example
Given: 1 –> 2 –> 6 –> 3 –> 4 –> 5 –> 6, val = 6
Return: 1 –> 2 –> 3 –> 4 –> 5

s思路:
1. 操作链表,要删除数。首先想想链表的边界是什么?左边是头节点,是边界,右边是为节点也是边界。如果要删除的节点恰好是头节点,就要考虑头指针改变的问题。因此用dummy或pointer-to-pointer。
2. 用dummy:首先需要新建一个node,赋初值为0,然后需要一个dummy指针指向这个node。
3. 用pointer-to-pointer: 之前总结过指向指针的指针的两种操作:第一种是只移动指向指针的指针到新的位置,这个操作相当于站位,放到需要的地方,不对链表产生改变;第二种操作是修改被指针指向的指针里的地址,让指针指向新的节点,这个操作会修改链表结构!
这里写图片描述
以上,operation 1表示移动pointer-to-pointer指向不同节点的指针域,operation 2表示修改节点的指针域,让指向新的node。这里最大的不同是,指针是低层次的,指向指针的指针是高层次的,更灵活,两者不是一个级别的事物!如果链表操作中同时需要这两个操作,就应该考虑用pointer-to-pointer

//方法1:dummy节点class Solution {public:    ListNode* removeElements(ListNode* head, int val) {        //        ListNode node(0);        ListNode* dummy=&node;        dummy->next=head;        head=dummy;        while(head->next){            if(head->next->val==val){                head->next=head->next->next;                }else                head=head->next;             }        return node.next;    }};//方法1.1:dummy节点,下面也行。但是需要delete dummy.不如上面方法来得快!class Solution {public:    ListNode* removeElements(ListNode* head, int val) {        //        ListNode* dummy=new ListNode(0);        dummy->next=head;        head=dummy;        while(head->next){            if(head->next->val==val){                head->next=head->next->next;                }else                head=head->next;             }        head=dummy->next;        delete dummy;        return head;    }};//方法2:pointer-to-pointerclass Solution {public:    ListNode* removeElements(ListNode* head, int val) {        //        ListNode** pp=&head;        while(*pp){            if((*pp)->val==val){                *pp=(*pp)->next;            }else                pp=&((*pp)->next);        }        return head;    }};
0 0