链表算法题目汇总
来源:互联网 发布:淘宝运营推广培训 编辑:程序博客网 时间:2024/06/06 11:46
题目一:查找倒数第K个结点
.已知一个带有表头结点的单链表,结点结构为:
datalink假设该链表只给出了头指针list,在不改变链表前提下,请设计一个尽可能高效的算法,查找链表中导数第K个位置上的结点(K为正整数)。若查找成功,算法输出为该节点的data域的值,并返回1,;否则,只返回0.要求:
- 描述算法的基本设计思想;
- 描述算法的详细实现步骤;
- 根据设计思想和实现步骤,采用程序设计语言描述算法,关键之处请给出简要注释。
解答:
- 基本设计思想:定义两个指针p,q,初始时均指向头结点的下一个结点,及链表的头结点。p指针沿着链表移动,当p指向第k个结点时,q指针开始与p指针同步移动,当p指针移动到最后一个节点时,q指针所指示的结点导数第k个结点。以上过程对链表进进行一遍扫描。
- 基本步骤略写。
- 算法实现代码如下:codeblocks12.11+gcc
//查找倒数第K个结点typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *link;}*LinkList;int search_k(LinkList listHead ,int k){ LinkList p = listHead ->link, q = listHead -> link ;//指针平,q指向第一个结点 int count = 0; while(p != NULL) { if(count < k) count ++; else q= q -> link; p = p -> link; } if (count < k) { return 0; } else { printf("%d\n", q->data); return 1; }}
题目二:单链表逆转
题目:已知一个带有头结点的单链表,设计一个高效算法实现该单链表的逆转算法。解答:
- 算法说明:略
- 算法实现代码:
LinkList linkReverse(LinkList listHead){ if(listHead == NULL || listHead-> link == NULL) { return listHead; /*链表为空,直接返回*/ } LinkList tmp = NULL, pre = NULL, cur = listHead -> link; while(cur != NULL) { tmp = cur-> link; cur-> link = pre; pre = cur; cur = tmp; } listHead ->link = pre; return listHead;}
总的代码:
运行环境codeblocks12.11 +gcc
#include <stdio.h>#include <stdlib.h>typedef int ElemType;typedef struct LNode{ ElemType data; struct LNode *link;}*LinkList;/*查找倒数第K个结点*/int search_k(LinkList listHead ,int k){ LinkList p = listHead ->link, q = listHead -> link ;//指针平,q指向第一个结点 int count = 0; while(p != NULL) { if(count < k) count ++; else q= q -> link; p = p -> link; } if (count < k) { return 0; } else { printf("%d\n", q->data); return 1; }}/* 链表逆转 */LinkList linkReverse(LinkList listHead){ if(listHead == NULL || listHead-> link == NULL) { return listHead; /*链表为空,直接返回*/ } LinkList tmp = NULL, pre = NULL, cur = listHead -> link; while(cur != NULL) { tmp = cur-> link; cur-> link = pre; pre = cur; cur = tmp; } listHead ->link = pre; return listHead;}int main(){ LinkList listNode[10]; int i =0 ; for(;i < 10 ;i++){ listNode[i] = (LinkList) malloc( sizeof(struct LNode) ); listNode[i]->data = i; if (i == 0){ listNode[i] -> link = NULL; }else{ listNode[i] -> link = listNode[i-1]; } } LinkList ListHead = (LinkList) malloc( sizeof(struct LNode) ); ListHead -> link = listNode[9]; LinkList tmp = ListHead -> link ; while(tmp != NULL){ printf("%d\t", tmp -> data); tmp = tmp -> link; } printf("\n"); linkReverse(ListHead); tmp = ListHead -> link ; while(tmp != NULL){ printf("%d\t", tmp -> data); tmp = tmp -> link; } printf("\n"); search_k(ListHead, 1); return 1;}
- 链表算法题目汇总
- 链表题目汇总
- 链表题目汇总
- 数据结构与算法题目汇总
- 链表算法汇总
- 数据结构之链表题目汇总
- 常用链表题目汇总,java描述
- 刷过的算法题目汇总列表
- 《计算机算法设计与分析》题目汇总
- NYOJ 贪心算法题目汇总(一)
- [面试算法] 剑指Offer题目代码汇总
- 面试题目汇总(JAVA算法/数据结构)
- 算法题目-反转链表
- 算法题目---反转链表
- 面试准备系列01----面试中的链表题目汇总
- 面试准备系列01----面试中的链表题目汇总
- 题目汇总
- 题目汇总
- Win7与CentOS双系统时间差8个小时问题 (转)
- java中native关键字
- hdu 3065 病毒侵袭持续中 (AC自动机)
- HDU1026 BFS&&优先队列&&路径保存
- uima初接触
- 链表算法题目汇总
- Linux C 定时器 篇(二)
- 无向图中国邮路(小数据版)
- 分糖果
- 【Oracle】Oracle概要文件
- 全域hash && 完美hash
- 负数的模
- WebBrowser控件表单(form)的自动填写和提交
- ++a可以为左值,VS2010