• [LeetCode]Remove Linked List Elements


    题目

    Remove all elements from a linked list of integers that have value val.

    Example
    Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
    Return: 1 --> 2 --> 3 --> 4 --> 5

    测试用例

    1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6
    
    6 --> 6 --> 1, val = 6
    
    6 --> 6 --> 6, val = 6
    
    1 --> 2 --> 6 --> 6 --> 6 --> 5 --> 6, val = 6

    解析

    这道题给出三种算法

    第一种:

    直接两个指针pre和cur,一前一后,相互挨着,cur指针遇到val后,pre的next直接指向cur的下一个指针,同时cur也向后移动一个。

    第二种:

    把指定的元素看成雷区,cur指针进入雷区后,pre停止并等待cur出雷区,同时pre的next指针指向出雷区的第一个元素。但是这种方法得有一个是否进入雷区的标志,但是我觉得可以优化。

    第三种方法:

    优雅的递归调用

    算法实现

    第一种实现:

    ListNode* removeElements(ListNode* head, int val) 
    {
    	ListNode *pre;
    	ListNode *cur;
    	ListNode *temp;
    	
    	pre = head;
    	while(pre != NULL && pre->val == val)
    	{
    		temp = pre;
    		pre = pre->next;
    		delete temp;
    	}
    	if(pre == NULL)
    	{
    		return NULL;
    	}
    	
    	head = pre;
    	cur = pre->next;
    	while(cur != NULL)
    	{
    		if(cur->val == val)
    		{
    			temp = cur;
    			pre->next = cur->next;
    			delete temp;
    		}
    		else
    		{
    			pre = cur;
    		}
    		cur = cur->next;
    	}//while
    	
    	return head;
    }
    

    第二种实现:

    第三种实现:

    ListNode* removeElements(ListNode* head, int val) 
    {
    	ListNode *temp = NULL;
    	if(head && head->val == val)
    	{
    		temp = head;
    		head = removeElements(head->next, val);
    		delete temp;
    	}
    	if(head && head->next)
    	{
    		head->next = removeElements(head->next, val);
    	}
    
    	return head;
    }
    

      

  • 相关阅读:
    用C#实现宽带重新拨号
    CALLBACK FUNCTION 回调函数
    编译程序 VS 解释程序
    《围城》读书笔记
    鼠标点击器
    工作与找工作的日子
    Windows 7下VS2003的查找无响应问题
    收藏几句关于程序的名言
    static知识小结
    如何定义和实现一个类的成员函数为回调函数(转)
  • 原文地址:https://www.cnblogs.com/stemon/p/4475168.html
Copyright © 2020-2023  润新知