#leetcode203


贴一张图

 炸掉了

上正确的代码

 1 class Solution {
 2 public:
 3     ListNode* removeElements(ListNode* head, int val) {
 4         ListNode* dummyhead = new ListNode(0);//new一块空间并设置初值为0,然后返回该空间的地址
 5         dummyhead -> next = head;//让虚拟链表头连接真正的链表头
 6         ListNode* cur = dummyhead;//声明一个遍历链表的指针,从遍历的起点是虚链表头
 7         while(cur -> next != NULL)
 8         {
 9             if (cur -> next -> val == val)//如果找到要删除的链表结点
10             {
11                 ListNode* temp = cur -> next;//声明临时指针保存要删除结点的地址
12                 cur -> next = cur -> next -> next;//让待删除结点的前继结点指向它的后继结点
13                 delete temp;//删除结点
14             }
15             else {
16                 cur = cur -> next;//更新当前指针
17             }
18         }
19         head = dummyhead -> next;//更新当前链表头
20         delete dummyhead;//删除虚拟链表头
21         return head;
22     }
23 };

早上写这题是看到吴师兄的推荐,但卡尔没推荐说这题是双指针系列,卡尔把这题归为链表操作,这里涉及到一个盲区就是--如果要删除的元素在链表头,就要先声明一个虚的链表头,然后让它的next指向head,我早上写的代码一直都朝双指针这方向写,测试用例可以过大部分,就是要删除元素在表头就报错,刷题路线要坚定不移地跟一个人的就行,跟卡尔,卡尔YYDS,不然就很浪费时间。

相关