《cracking the coding intreview》——链表
前言
单链表
思路
代码(c语言)
/**
* Implement an algorithm to find the nth to last element of a singly linked list
*/ #include <stdio.h>
#include <stdlib.h> typedef struct link {
int value;
struct link *next;
} link; /**
* 创建单链表
*
* T = O(n)
*
*/
void createLinklist(link **head, int data)
{
link *pre, *cur, *new;
cur = *head;
pre = NULL; while (cur != NULL) {
pre = cur;
cur = cur->next;
} new = (link *)malloc(sizeof(link));
new->value = data; if (pre == NULL)
*head = new;
else
pre->next = new;
} /**
* 打印单链表
*
* T = O(n)
*/
void printLinklist(link *head)
{
while (head->next != NULL) {
printf("%d ", head->value);
head = head->next;
}
printf("%d\n", head->value);
} /**
* 寻找单链表倒数第m个节点
*
* T = O(n)
*
*/
void findMthToLast(link *head, int m)
{
if (head == NULL) return;
link *s1, *s2;
int i;
// s1指向表头,s2指向从s1开始后m个元素的位置,然后s1与s2同时后移,到s2为NULL时停止,s1为mth to last
s1 = s2 = head; for (i = 0; i < m; i ++) {
s2 = s2->next;
} while (s2 != NULL) {
s1 = s1->next;
s2 = s2->next;
} printf("%d\n", s1->value);
} int main(void)
{
int i, n, m, data;
link *head; while (scanf("%d", &n) != EOF) {
for (i = 0, head = NULL; i < n; i ++) {
scanf("%d", &data);
createLinklist(&head, data);
} // 接收mth to last
scanf("%d", &m); if (m > n) {
printf("输入数据有误!\n");
} else {
printLinklist(head);
findMthToLast(head, m);
}
} return 0;
}
循环链表
思路
代码(c语言)
/**
* Given a circular linked list, implement an algorithm which returns
* node at the begining of the loop
*/ #include <stdio.h>
#include <stdlib.h> typedef struct link {
int value;
struct link *next;
} link; /**
* 创建单链表
*
* T = O(n)
*
*/
void createLinklist(link **head, int data)
{
link *cur, *pre, *new; cur = *head;
pre = NULL; while (cur != NULL) {
pre = cur;
cur = cur->next;
} new = (link *)malloc(sizeof(link));
new->value = data;
new->next = cur; if (pre == NULL) {
*head = new;
} else {
pre->next = new;
}
} /**
* 从m个节点开始构建循环链表
*
* T = O(n)
*
*/
void initLoopList(link *head, int m)
{
link *cur, *pre, *target;
cur = head; while (-- m && cur != NULL) {
cur = cur->next;
}
target = cur; while (cur != NULL) {
pre = cur;
cur = cur->next;
}
pre->next = target;
} /**
* 寻找循环开始点的value
*
* T = O(n)
*
*/
void loopStart(link *head)
{
link *fast, *slow, *p, *q;
int i, len; for (slow = head, fast = slow->next->next; fast != slow;) {
slow = slow->next;
fast = fast->next->next;
} for (len = 1, slow = slow->next; slow != fast; slow = slow->next) {
len += 1;
} p = q = head;
for (i = 0; i < len; i ++) {
q = q->next;
} while (p != q) {
p = p->next;
q = q->next;
}
printf("%d\n", q->value);
} int main(void)
{
link *head;
int i, n, m, data; while (scanf("%d", &n) != EOF) {
// 创建单链表
for (i = 0, head = NULL; i < n; i ++) {
scanf("%d", &data);
createLinklist(&head, data);
} // 第m个点开始循环
scanf("%d", &m);
if (m > n) continue;
initLoopList(head, m); // 查找循环起始节点(只提供头节点)
loopStart(head);
} return 0;
}
《cracking the coding intreview》——链表的更多相关文章
- 链表<新>
class Node: ''' 节点类 链表节点结构 data next data: 节点保存的数据 _next: 保存下一个节点对象 ''' def __init__(self, data, pne ...
- c++ 链表删除重复的数据
//List.h #include <iostream> typedef int dataType; struct Node{ Node():data(),pNextNode(NULL){ ...
- 链表的基本操作(Basic Operations on a Linked List)
链表可以进行如下操作: 创建新链表 增加新元素 遍历链表 打印链表 下面定义了对应以上操作的基本函数. 创建新链表 新链表创建之后里面并没有任何元素,我们要为数据在内存中分配节点,再将节点插入链表.由 ...
- linux内存源码分析 - 内存回收(lru链表)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 对于整个内存回收来说,lru链表是关键中的关键,实际上整个内存回收,做的事情就是处理lru链表的收缩,所以 ...
- PAT 1025 反转链表
PAT (Basic Level) Practise 1025 Github链接:https://github.com/H-BING/object-oriented/tree/master/PAT10 ...
- (转)linux内存源码分析 - 内存回收(lru链表)
原文:http://www.cnblogs.com/tolimit/p/5447448.html 概述 对于整个内存回收来说,lru链表是关键中的关键,实际上整个内存回收,做的事情就是处理lru链表的 ...
- OptimalSolution(3)--链表问题(1)简单
单链表Node节点类 public class Node { public int val; public Node next; public Node(int val) { this.val = v ...
- java 8 jdk1.8 新特性
1Lambda表达式 2函数式接口 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. java 8为函数式接口引入了一个新注解@Fu ...
- 【数据结构和算法】001 单链表 LinkedList
一.单链表(LinkedList)介绍和内存布局 链表是有序的列表,它在内存中的实际存储结构如下: 看上去虽然无序,但他是靠灭个链表节点元素的地址和next域来分清首尾相连的顺序,如下图所示,由头指针 ...
- 详细分析链表的数据结构的实现过程(Java 实现)
目录 链表的数据结构的实现过程(Java 实现) 前言 基本概念 链表的基本结构 链表的基本操作的实现 在链表中添加元素 在链表头添加元素 在链表指定位置处添加元素 链表的虚拟头节点 链表的查询和修改 ...
随机推荐
- 1.cocos2dx存储卡的游戏代码、而游戏移植到“华为荣耀”电话、问题的总结移植
1记忆卡片游戏代码 CardItem.h #pragmaonce #ifndef__CardItem_H__ #define__CardItem_H__ #include"cocos2 ...
- BZOJ 1004 HNOI2008 Cards Burnside引理
标题效果:特定n张卡m换人,编号寻求等价类 数据保证这m换人加上置换群置换后本身构成 BZOJ坑爹0.0 条件不那么重要出来尼玛怎么做 Burnside引理--昨晚为了做这题硬啃了一晚上白书0.0 都 ...
- Mobile开发的饕餮盛宴-Zoomla!波CMS2 x2.1正式宣布
饕餮 [tāo tiè] 古代汉族神话传说中龙的第五子,是一种存在于传说.想象的神奇怪兽. 古书<山海经>介绍其特点是:其形状如羊身人面,其目在腋下,虎齿人爪.其音如婴儿. 作为中国本土软 ...
- [ 流行的网络框架 ] AFN & ASI
1.AFN & ASI(早已经停止更新,但现在许多公司也在使用.) AFNetWorking地址:https://github.com/AFNetworking/AFNetworking AS ...
- HDU 4791 & ZOJ 3726 Alice's Print Service (数学 打表)
题目链接: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=4791 ZJU:http://acm.zju.edu.cn/onlinejudge/showP ...
- 多线程学习之一独木桥模式Single Threaded Execution Pattern
Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...
- 条形码(JBarcode)
一世尘梦 少小离家老大回,妖娆尘世,程序唧唧:问君能有几多愁,恰是满屏BUG无处修. 商品条形码(JBarcode) 之前没有使用过这个,现在使用JBarcode生成商品条形码,工作之前的准备工作: ...
- 第三记“晋IT”分享成长沙龙
2014年8月17日下午4点-7点,第三期"晋IT"分享成长沙龙在太原大自然蒙特梭利幼儿园多功能厅成功举办. 8月17日下午两点.小编领先来到场地,提前探訪一下准备情况. &quo ...
- 【UVA】10285-Longest Run on a Snowboard(动态规划)
这是一个简单的问题.你并不需要打印路径. 状态方程dp[i][j] = max(dp[i-1][j],dp[i][j-1],dp[i+1][j],dp[i][j+1]); 14003395 10285 ...
- [译]在运行时内存中的Java对象是怎么样的
(文章翻译自What do Java objects look like in memory during run-time?) 我们知道函数在内存中是作为一个活动记录栈来实现的.而且我们知道Java ...