zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    

      

  • 相关阅读:
    使用C++与SFML编写一个简单的撞球游戏Part3——创建游戏启动界面
    生命游戏
    一道面试题
    为目标数字添加逗号分隔,由 baidu.number.comma 想到的
    制作JavaScript选择器(1)解析令牌
    Team Foundation 使用第三方比较工具
    Levenshtein Distance算法
    计算颜色的亮度值
    整理QUnit API
    Scrum笔记整理
  • 原文地址:https://www.cnblogs.com/Christal-R/p/14217645.html
Copyright © 2011-2022 走看看