LeetCode203. 移除链表元素

LeetCode203. 移除链表元素

1.题目

在这里插入图片描述

2.思路

整体思路就是删去结点,但是有以下两种实现方式。

(1)不使用哨兵结点
相对来说更复杂,因为不好处理头结点,有两种思路。
a.一开始特判头结点,时间复杂度较高。
b.最后再判定头结点。

(2)使用头结点

3.具体代码实现

创建链表及函数接口

 struct ListNode {
     int val;
     ListNode *next;
     ListNode() : val(0), next(nullptr) {}
     ListNode(int x) : val(x), next(nullptr) {}
     ListNode(int x, ListNode *next) : val(x), next(next) {}
 };
 
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
    } };
不使用哨兵结点
(1) 先特判头结点
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
         ListNode* p =head; //指向头结点 
    	 //特判头结点 
    	 while(p!= NULL && p->val == val)
    	 {
    	 	ListNode* m =p;
    	 	head = head->next;
    	 	p = p->next;
    	 	delete m;
		 }
    	if(head == NULL) return nullptr;//1.NULL还是nullptr?都对
    	
        ListNode* q =head; //指向头结点 固定了! 而且肯定不会是待删除的 
		while(q != NULL && q->next != NULL)//2.q!=NULL可以不写吗?可以
		{
			if(q->next->val == val)
			{
				ListNode* n = q->next;
				q->next = n->next;  //把链表连起来 
				delete n;
			}
			else//这个不能丢
			q = q->next;
		}
		return head;
       
    }
};

注意事项

1.return NULL/nullptr/head 都是正确的。
2.当q所指向的位置不确定是否真的存在时不能只写q->next != NULL ,必须对q的指向也有判断。
3.删除结点不能忘记把链表连起来

(2)最后判断头结点
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
 		ListNode* p =head; //指向头结点 
		ListNode* m =head; //指向头结点
		
		while(p!= NULL && p->next != NULL)//1.不能没有p!=NULL 没有判断当前指针的指向是否有意义!
		{
			if(p->next->val == val){
				ListNode* q =p->next;
				p->next = q->next;
				delete q;}
			else
				{p = p->next;}	
		} 
		特判头结点
		if(head != NULL && head->val == val)//最后判定头结点 不为空且值为val
		{
			if(head->next != NULL)//头结点后有元素
			{
				head = head->next;
				delete m;
				return head;
			}
			else//头结点后没有元素
			{
                delete head;
                return head;//2.这里换成NULL还有nullptr都可以
			}
		}
        else//头结点为空
        return head;
   }
  };

注意事项

1.一定要判断当前指针的指向是否有意义!
2.return head 这里换成NULL还有nullptr都可以

使用哨兵结点
class Solution {
public:
  ListNode* removeElements(ListNode* head, int val) {
     //设置一个哨兵结点
	  ListNode* dummyHead = new ListNode(0); 
      dummyHead->next = head;//指向头结点
      ListNode *p = dummyHead;
      
		while(p->next!= NULL)
		{
			if(p->next->val == val)
			{
				ListNode *q = p->next;
				p->next = q->next;
				delete q;
			}else
			p = p->next;
		} 
		
       head = dummyHead->next;//不知道对不对 
       delete dummyHead;//不delete也行 习惯应该delete
       return head;
    }
};

注意事项

1.使用哨兵结点应该释放!这个习惯比较好!
2.dummyHead的创建:(按照struct里的函数)

//1.
ListNode* dummyHead = new ListNode(0); 
dummyHead->next = head;//指向头结点

//2.
ListNode *dummyHead = new ListNode(0,head);//同时规定其数值和指针指向 

//3. 也可以先规定指向再规定数值。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值