• 203.移除链表元素


    题目描述

    删除链表中等于给定值 val 的所有节点。

    示例:

    输入: 1->2->6->3->4->5->6, val = 6
    输出: 1->2->3->4->5

     

    注意点

    1、删除点在开头;

    2、删除点在结尾;

    3、连续删除两个位置;

    4、需delete手动释放内存;

    头结点命中处理

    1、头结点命中特殊处理;

    2、引入虚拟头结点;

    删除操作

    1、两个指针完成删除;

    2、一个指针完成删除;

    方法一

    头结点命中特殊处理,利用两个指针完成删除操作;

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* removeElements(ListNode* head, int val) {
            if( head == NULL )
        		return head;
    
        	ListNode *p = head;
        	ListNode *pre = p;
        	while( p )
        	{
        		if( p->val == val )
        		{
        			if( pre == p )
        			{
        				head = head->next;
        				p = head;
        				pre = p;
        			}
        			else
                    {
                    	pre->next = p->next;
                    	p = p->next;
                    }
        		}
        		else
        		{
        			pre = p;
        			p = p->next;
        		}
        	}
    
        	return head;
        }
    };
    

      

     

    方法二

    引入虚拟头结点,利用两个指针完成删除操作;

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* removeElements(ListNode* head, int val) {
            if( head == NULL )
        		return head;
    
        	ListNode *res = new ListNode(0);
        	ListNode *p = head;
        	res->next = head;
        	ListNode *pre = res;
        	while( p )
        	{
        		if( p->val == val )
        			pre->next = p->next;
        		else
        			pre = p;
        		p = p->next;
        	}
    
        	return res->next;
        }
    };
    

      

    方法三

    引入虚拟头结点,一个指针完成删除;

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* removeElements(ListNode* head, int val) {
            if( head == NULL )
        		return head;
    
        	ListNode *res = new ListNode(0);
        	res->next = head;
            ListNode *p = res;
    
        	while( p->next )
        	{
        		if( p->next->val == val )
        		{
        			ListNode *tmp = p->next;
        			p->next = p->next->next;
        			delete tmp;
        		}
        		else
        			p = p->next;
        	}
    
        	return res->next;
        }
    };
    

      

  • 相关阅读:
    vue展开过度动画
    css3,transition,animation两种动画实现区别
    css3动画
    html浏览器高度和宽度和其他dom获取
    afert和b的伪类画三角形
    java导入web项目httpservlet报错
    小程序事件
    Python动态语言的特性
    非关系型数据库之Redis
    深度学习必备基础知识
  • 原文地址:https://www.cnblogs.com/Christal-R/p/14217645.html
Copyright © 2020-2023  润新知