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
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode** ct=&head;
while(*ct !=nullptr)
{
if((*ct)->val== val)
{
*ct=(*ct)->next;
}
else
{
ct=&((*ct)->next);
}
}
return head;
}
};
思想:主要用到的是二级指针的思想。这个二级指针存放的(即指向的)是一个指向节点的指针的next指针(例如ListNode* head;中 head->next),因为head是指针,其指针next就要用双重指针。其中判断为结束的标志为,这个双重指针指向的是不是一个 指向null的指针。若是,则结束。其实这个指向null的指针即为 最后一个节点的next指针。
这种做法的优势就是不用怕指向null了,不用判断那么复杂了,只要判断一个是否是指向null的指针
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* newhead=new ListNode(0);
ListNode* cur=newhead;
newhead->next=head;
while(cur)
{
if((cur->next)&&(cur->next->val==val)) cur->next=cur->next->next;
else cur =cur->next;
}
return newhead->next;
}
};
思想:这个的做法相对好理解,就是在head前面加一个节点以解决难以判断next的next的问题。