首页 > 学院 > 开发设计 > 正文

Leetcode 203. Remove Linked List Elements

2019-11-09 20:50:42
字体:
来源:转载
供稿:网友

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; }};
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表