刪除鏈表中等于給定值val的所有節點。
樣例
給出鏈表 1->2->3->3->4->5->3
, 和 val = 3
, 你需要返回刪除3之后的鏈表:1->2->4->5
。
基本操作。
找到這個數,并且把其前后兩個連起來,就可以了。
遍歷的時候用當前數據比較的話會丟失掉前一個節點的信息,所以我們用current->next->val
作為遍歷的主體,這樣我們在頭節點之前加一個假的節點。然后把這個節點的位置保存起來,再進行遍歷:
ListNode *removeElements(ListNode *head, int val)
{
if(head==NULL)
return NULL;
ListNode *first;
first->next=head;
head=first;
while(head->next!=NULL)
{
if(head->next->val==val)
{
head->next=head->next->next;
}
else
head=head->next;
}
return first->next;
}
也可以不借助這個假節點,但是頭節點要單獨檢查:
ListNode *removeElements(ListNode *head, int val) {
// Write your code here
while(1)
{
if ( head == NULL )
return NULL;
if(head->val==val)
head=head->next;
else
break;
}
if ( head == NULL ) {
return NULL;
}
auto current=head;
while(current->next!=NULL)
{
if(current->next->val==val)
{
current->next=current->next->next;
}
else
current=current->next;
}
return head;
}
稍微麻煩一點,還是推薦使用假頭節點的寫法,簡單一些。
鏈表
鏈表有很多種,這里給的是單向鏈表,鏈表由節點構成,每一個節點包含兩個信息,分別是數據和鏈(實際上就是一個指針,指向下一個節點,如果沒有下一個這個指針為NULL)。
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
這是題目中給出的一個單向鏈表節點,數據類型為int。附帶一個構造函數。
除此之外還有雙向鏈表(每一個鏈表有兩條鏈,分別指向前一個和后一個節點),循環鏈表也是有的,就是收尾又鏈接起來,顯而易見是有單向循環也有雙向循環的。
鏈表的優點:
插入刪除方便,只要改變指針的指向就可以,不用像數組一樣需要移動數據。
鏈表的缺點:
因為內存不連續,所以查找效率不高。
它的優缺點和數組剛好是反過來的。