Leetcode-203.移除链表元素

题目背景

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例 1:
在这里插入图片描述
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2:

输入:head = [], val = 1 输出:[] 示例 3:

输入:head = [7,7,7,7], val = 7 输出:[]

提示:

列表中的节点在范围 [0, 104] 内 1 <= Node.val <= 50 0 <= k <= 50

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-linked-list-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if(!head)
            return head;
        head->next = removeElements(head->next,val);
        if(head->val == val)
            return head->next;
        else
            return head;
    }
};
解法二
  • 移除链表元素,目前想写一个完整的,自己可运行的程序
  • 首先定义出链表,定义一个单链表怎么定义呢,是一个结构体,在其中需要整体定义它的值,指向下一个的指针,构造函数,有值的构造函数,指向下一个节点链接的构造函数。一定要记住叫构造函数。
struct ListNode{
	int val;//节点上存储的元素
	ListNode* next;//指向下一节点的指针
	ListNode():val(0),next(NULL){}//三个节点的构造函数
	ListNode(int x):val(x),next(NULL){}
	ListNode(int x,ListNode* next):val(x),ListNode(next){}
}
  • 有两种移除链表节点的方式
  • 一是直接从原链表上移除,这个需要两个逻辑,一个是单独移除头节点,一个是移除除头节点以外的节点
ListNode* removeElements(ListNode* head,int val){
	while(head!=NULL&&head->val == val){
		ListNode* tmp = head;
		head = head->next;
		delete tmp;
	}
	ListNode* cur = head;
	while(cur != NULL && cur->next!=NULL){
		if(cur->next->val == val){
			ListNode *tmp = cur->next;
			cur->next = cur->next->next;
			delete tmp;
		}else{
			cur = cur->next;
		}
	}
		return head;
	}
};
解法三

创建一个虚拟节点

class Solution{
	public:
		ListNode* removeElements(ListNode* head, int val){
			ListNode* virtNode = new ListNode(0);
			virtNode->next = head;
			ListNode* cur = virtNode;
			while(cur->val != NULL){
				if(cur->next->val == val){
					ListNode* mid = cur->next;
					cur->next = cur->next->next;
					delete mid;
				}else{
					cur = cur->next;
				}
			}
			head = virtNode->next;
			delete virtNode;
			return head;				
		}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值