Skip to content

203. 移除链表元素 ​

203. 移除链表元素

cpp
class Solution {
  public:
	ListNode *removeElements(ListNode *head, int val)
	{
		// 头结点
		ListNode *l = new ListNode();
		l->next = head;

		ListNode *p = l;
		while (p->next != nullptr) {
			if (p->next->val == val) {
				ListNode *tmp = p->next->next;
                delete p->next;
				p->next = tmp;
			}
			else {
				p = p->next;
			}
		}
		head = l->next;
		delete l;
		return head;
	}
};

思路 ​

正如我在我的博客文章 中说的那样,链表带不带这个虚拟头结点会影响链表操作的一致性,这里也是一样的。这个题他原来的数据没有给你这个虚拟头结点,head上来就指向了数据结点,很不好。所以我们要自己去创建一个虚拟头结点。

用new去申请内存搞一个结点,让这个结点的next指向题目给的head。

然后以这个虚拟头结点为起点,往后看p->next这个结点是不是符合要求的结点,符合就删。用的C++,记得释放内存

改进后代码 ​

cpp
class Solution {
  public:
	ListNode *removeElements(ListNode *head, int val)
	{
		// 头结点
		ListNode *l = new ListNode();
		l->next = head;

		ListNode *p = l;
		while (p->next != nullptr) {
			if (p->next->val == val) {
				ListNode *tmp = p->next->next;
				p->next = p->next->next;
				delete tmp;
			}
			else {
				p = p->next;
			}
		}
		head = l->next;
        delete l;
		return head;
	}
};