移除链表元素

移动链表元素

题目链接

这道题考查的就是链表的删除操作。

我的想法是用两个结点指针p、q分别指向正在比较的结点和该结点的前一个结点,以便删除时进行q->next = p->next的操作。

但是我犯了一个错误,在对每个结点进行判断后,我都写上了q = p的语句,如果这时p为要删除的结点,在我进行了q = p的操作后,q指向被删除的结点,也就是这样:

这里记录两种写法:

1、使用原来的链表进行删除

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        //先将头结点判断完毕 
        while(head != nullptr && head->val == val) {
        	ListNode *temp = head;
        	head = head->next;
        	delete temp;
		}
		ListNode* p = head;
        while(p != nullptr && p->next != nullptr)  {  //后一句判断不可少 
            if(p->next->val == val) {   //判断p->next,就不用再设置变量保留删除结点的前结点 
                ListNode* temp = p->next;
                p->next = p->next->next;
				delete temp;	
            }
            else {
            	p = p->next;
			} 
        }
        return head;
    }
};

2、设置虚拟头结点进行删除

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* NewHead = new ListNode(0); // 设置一个虚拟头结点
        NewHead->next = head; // 将虚拟头结点指向head,这样免去了后面单独对删除头结点的操作
        ListNode* p = NewHead;
        while (p->next != NULL) {
            if(p->next->val == val) {
                ListNode* tmp = p->next;
                p->next = p->next->next;
                delete tmp;
            } else {
                p = p->next;
            }
        }
        head = NewHead->next;
        delete NewHead;
        return head;
    }
};

 

posted @ 2022-09-12 15:05  aya77  阅读(21)  评论(0)    收藏  举报