zoukankan      html  css  js  c++  java
  • 剑指offer-重新排序数组,倒置链表

    重新排序数组

    描述

    根据特定条件重新排序数组,如将奇数排到偶数前面。将负数排到偶数前面。

    思路:

    设置两个指针,前指针和后指针。将条件作为一个函数传入,两个指针向中间移动,不符和条件的交换。

    代码:

    bool fun(int n)
    {
    	if (n % 2 == 0)
    		return 0;
    	else
    		return 1;
    }
    void ReorderArray(int* arr, int len, bool (*fun)(int n))
    {
    	int* phead = arr;
    	int* pend = arr + len - 1;
    	while (phead < pend)
    	{
    		while (phead < pend && fun(*phead) == 1)
    		{
    			phead++;
    		}
    		while (phead < pend && fun(*pend) == 0)
    		{
    			pend--;
    		}
    		if (phead < pend)
    		{
    			int temp = *phead;
    			*phead = *pend;
    			*pend = temp;
    		}
    	}
    }
    	void ReorderArrayWith01(int* arr, int len)
    	{
    		ReorderArray(arr, len, fun);
    	}
    

    倒置链表

    思路:

    1.循环方式需要用三个指针,p,为了连接到前面的节点,需要ppre,为了防止断链,需要pnext。
    2.递归方式

    问题规模缩小

    结果

    假设2开头的链表已经反转成功,接下来只要将2的next指向1,而1的next指向null即可。
    其实只要将两个节点反过来即可。

    代码:

    ListNode* ReverseList(ListNode* head)
    {
    	if (head == NULL)
    		return NULL;
    	if (head->next == NULL)
    		return head;
    	ListNode* reversedhead = NULL;
    	ListNode* p = head;
    	ListNode* ppre = NULL;
    	ListNode* pnext = NULL;
    	while (p!=NULL)
    	{
    		pnext = p->next;
    		p->next = ppre;
    		ppre = p;
    		p = pnext;
    	}
    	reversedhead = ppre;
    	return reversedhead;
    }
    ListNode* ReverseListR(ListNode* head)
    {
    	if (head == NULL ||head->next==NULL)
    		return head;
    	ListNode *res=ReverseListR(head->next);
    	head->next->next = head;
    	head->next=NULL;
    	return res; 
    }
    
  • 相关阅读:
    浏览器20年图说简史
    CF1437D Solution
    CF1446B Solution
    CF1444A Solution
    CF1437C Solution
    让您的网站拥有MSDN资源库搜索功能[转摘MSDN]
    自定义web part版面变形的原因
    SPS中模板保存数据库的位置
    利用配置文件自定义站点
    VS.NET2003 开发环境 生成样式表 和 自动书写HTML对象模型
  • 原文地址:https://www.cnblogs.com/void-lambda/p/12357353.html
Copyright © 2011-2022 走看看