反转链表 & 找链表的入环点 & 找链表的倒数第k个节点 & 使得数组中奇数位于偶数之前

反转链表:
        1. 用头插来实现
        2. 用栈来实现(递归)
        3. 三个指针,一个表示本节点,一个表示前驱,一个表示后继
 

找链表的入环点:

       第一步确认是否有环:

            方法:快慢指针:
                       一个走得快,一个走的慢,当慢的能追上快的就是有环
                        如果当走得快的走到了结尾,则表示没环。

       第二步找入环点:

              方法1. 一个指针先从头走环的大小个步,然后第二个和第一个一起走,则相遇时就是入环点
              方法2. 快慢指针相遇点到入环点的距离==从头开始到入环点的距离

确定是否有环的代码如下:

ListNode* MeetingNode(ListNode* pHead) //找是否有环
{
	if (pHead == NULL)
		return NULL;

	ListNode *pslow = pHead->next;//慢
	if (pslow == NULL)
		return NULL;
	ListNode* pfast = pslow->next;//快
	
	while (pfast != NULL && pfast->next != NULL)
	{
		if (pslow == pfast)
			return pslow;

		pslow = pslow->next;
		pfast = pfast->next->next;
	}

	return NULL;
}

 

找链表的倒数第k个节点

分析:

      方法1,先计算链表长度,在找第k个节点
      方法2. 两个指针,一个先走k-1步;第k步开始时,两个指针一块走;当先走的到尾时,则后走的所在位置就是第 k个节点

注意:链表可能总长度都不为 k,所以针对这个情况要处理

代码实现如下:

ListNode *FindKthToTail(ListNode* plist, unsigned int  k)
{
	if (plist == NULL || k == 0)
		return NULL;

	ListNode *pAheaad = plist;
	ListNode *pBehind = NULL;
	int i = 0;
	for (unsigned int i = 0; i < k - 1; i++) //先走k-1步
	{
		if (pAheaad->next != NULL)
			pAheaad = pAheaad->next;
		else //链表长度没有k-1长度个
			return NULL;
	}

	pBehind = plist;
	while (pAheaad->next != NULL) //后续还有数据
	{
		pBehind = pBehind->next;
		pAheaad = pAheaad->next;
	}
	return pBehind; //返回后走的节点,即为倒数第k个节点
}

 

 

使得数组中奇数位于偶数之前

分析:使用二分的思想

代码实现:

void reOrderArray(int *arr, int len)
{
	int index1 = 0;
	int index2 = len - 1;

	while (index1 < index2)
	{
		while (index1 < index2 && (arr[index1] & 0x1) == 1)
			index1++;
		while (index1 < index2 && (arr[index2] & 0x1) == 0)
			index2--;
		if (index1 < index2)
		{
			int tmp = arr[index1];
			arr[index2] = arr[index1];
			arr[index1] = tmp;
		}
	}
}

扩展:我们可以通过函数指针来是实现范式,使得此代码的结构不变情况下完成更多的不同需求"分边"任务。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值