数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
来源:互联网 发布:迅捷路由器网络不稳定 编辑:程序博客网 时间:2024/05/17 08:16
1. 引言
本文主要讲解一些常见的关于链表的算法和面试题。
2. 单链表的反序(不带头结点)
/* 不带头结点的单链表逆转 */#include "ds.h"using namespace std;typedef intElemType;typedef struct LNode{ElemType data;struct LNode*next;}LNode, *LinkList;void InitList(LinkList &L);void TailCreList(LinkList &L, int n);void ReverseList(LinkList &L);void TraverseList(LinkList L);void InitList(LinkList &L){L = NULL;}void TailCreList(LinkList &L, int n){LinkList p, tail, s;int i;if (0 > n)return;tail = L;printf("please input %d number:", n);for (i = 1; i <= n; i++){s = (LinkList)malloc(sizeof(LNode));scanf("%d", &(s->data));if (1 == i){s->next = tail;L = tail = s;}else{tail->next = s;tail = tail->next;}}tail->next = NULL;}void ReverseList(LinkList &L){LinkList pre_pre, pre, cur;// 链表为空和只有一个元素时不用逆转if (NULL == L || NULL == L->next)return;cur = L;pre = NULL;// 从第二个元素开始逆转,while (cur->next){// pre_pre, pre, cur 向前移动pre_pre = pre;pre = cur;cur = cur->next;// 开始逆转pre->next = pre_pre;}// 将最后一个结点指向其前驱cur->next = pre;// 头指针指向最后一个结点LL = cur;}void TraverseList(LinkList L){LinkList p = L;while (p){printf("%d ", p->data);p = p->next;}printf("\n");}int main(){LinkList L;InitList(L);TailCreList(L, 5);TraverseList(L);ReverseList(L);TraverseList(L);}
3. 输入一个单向链表,输出该链表中倒数第 k 个结点。
// 输入一个单向链表,输出该链表中倒数第 k 个结点。#include "ds.h"using namespace std;typedef intElemType;typedef struct LNode{ElemType data;struct LNode*next;}LNode, *LinkList;void InitList(LinkList &L);void TailCreList(LinkList &L, int n);int OutputLast_K(LinkList L, int k);void TraverseList(LinkList L);void InitList(LinkList &L){L = NULL;}void TailCreList(LinkList &L, int n){LinkList p, tail, s;int i;if (0 > n)return;tail = L;printf("please input %d number:", n);for (i = 1; i <= n; i++){s = (LinkList)malloc(sizeof(LNode));scanf("%d", &(s->data));if (1 == i){s->next = tail;L = tail = s;}else{tail->next = s;tail = tail->next;}}tail->next = NULL;}/*返回值说明:0 -> 输出成功-1 -> 链表为空或k<1-2 -> 链表长度小于k*/int OutputLast_K(LinkList L, int k){LinkList p_k = L, p_add_k = L;int i = 0;// 链表为空和k<1if (NULL == L || k < 1){if (k < 1)printf("k < 1 \n");return -1;}// 当p_add_k到链表尾部时,p_k到倒数第k个结点处while (p_add_k){if (i < k){i++;}else{p_k = p_k->next;}p_add_k = p_add_k->next;}// 链表长度大于等于Kif (i == k){while (p_k){printf("%d ", p_k->data);p_k = p_k->next;}printf("\n");}// 链表长度小于Kelse{printf("List L less %d element.\n", k);return -2;}return 0;}void TraverseList(LinkList L){LinkList p = L;while (p){printf("%d ", p->data);p = p->next;}printf("\n");}int main(){LinkList L;InitList(L);TailCreList(L, 5);TraverseList(L);for (int i = 0; i < 8; i++ )OutputLast_K(L, i);}
0 0
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 数据结构学习笔记(四)--关于线性表的一个小疑问
- 数据结构与算法学习笔记02_1(线性表)
- 数据结构与算法学习笔记02_2(线性表)
- 数据结构与算法学习笔记02_3(线性表)
- 数据结构之线性链表的算法
- 关于线性链表的一些操作
- 数据结构学习笔记——线性表的逻辑结构
- 数据结构学习笔记(10)---基于线性表的查找
- 【线性表二:】大学数据结构实验报告中的两三个关于线性表的小算法
- mysql的一些练习题和面试题
- 【学习笔记----数据结构03--线性链表】
- 数据结构学习笔记(2)线性表
- 数据结构学习笔记 --- 线性表 (单链表)
- 数据结构学习笔记 --- 线性表 (单链表)
- 数据结构-线性表(学习笔记)
- 数据结构学习笔记-线性表
- 数据结构学习笔记 --- 线性表 (单链表)
- 数据结构学习笔记 --- 线性表 (双向链表、循环链表)
- Android.mk的用法和基础
- 数据结构学习笔记 --- 线性表 (应用举例)
- 数据结构学习笔记 --- 线性表 (一元多项式的表示及相加)
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 在Android的c/c++代码中使用LOG
- Android LOG机制流程图
- Google左侧排名优化
- 百度、Google.yahoo排名机制和优化规则
- 数据结构学习笔记 --- 栈
- 数据结构学习笔记 --- 栈的应用举例
- 数据结构学习笔记 --- 队列(链队列)
- 【转】教你用搜狗打特殊符号