赞
踩
链表是我们工作和面试的中常常会遇到的知识点,只有长时间的练习和思考才能游刃有余。故总结以下几个比较经典的链表题和对应的代码,进行参考。
思路:
#include<stdlib.h> |
该题,我觉得可以拓展到以下三个问题:
思路:
#include<stdlib.h> |
思路:
int ring_len(Node* head) |
思路:
依据:快指针和慢指针相遇时,慢指针肯定还没有超过整个链表长度。而快指针应该是超过链表加上nr(n,表示正整数,r表示环的长度)
现做这样的假设:
链表的整个长度是L
头节点到入口点的距离为a
第一次相遇点距离入口点为X,并走了s步
得到以下公式:
2s -s = nr
x+a = s
可以得到a= (n-1)r + (r-x)
其中r-x表示相遇点到入口点的距离。
故:从head节点,第一次相遇节点分别出发。再次相遇肯定是入口点。
Node* ring_meet(Node* head) |
该问题其实就是环检测的变种。只要将其中一个链表尾节点指向头节点。再检测另一条链表中是否存在环即可。
思路:
遍历其中一个链表,将节点与另一链表进行比较,进行插入。
Node * list_merge(Node*L1 , Node*L2) |
思路:
int delete_node(Node* head,Node* delete) |
思路:(当链表长度为偶数,取相邻两个节点的第一个)
Node* mid_node(Node* head) |
约瑟夫问题,是我偶然看到的一个算法题。感觉很有意思,就记录下来了。
故事:
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决?Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
该问题拓展很多,这里我给出的问题,有100个人,每数到3,就剔除,输出剔除顺序。
例如: 1,2,3,4,5,6
输出:3,6,4,2,5,1
思路:
实现起来应该是很简单的,就是有N个节点的环,从头节点开始,依次数数,当数到3时,就将节点删除,一直重复到只有一个节点。
int Joseph(Node* head) |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。