单链表的建立、插入等替他操作见本人博客:

单链表的基本操作 http://10741357.blog.51cto.com/10731357/1736387

【面试题】单链表的操作2http://10741357.blog.51cto.com/10731357/1736403

介绍了6种有关单链表的面试题,对于以下链表要求的实现,解题的思路很重要。

各函数的实现,代码如下:

#include"SListNode.h"void PrintTailToHead(SListNode* pHead)//从尾到头打印单链表
{//递归实现if (pHead){PrintTailToHead(pHead->next);printf("%d->", pHead->data);}
}
void DelNonTailNode(SListNode* pos)//删除一个无头单链表的非尾节点(删除pos节点)
{//替换法//1->2->3->4删除第2个节点时,将第三个节点值赋给第二个1->3->2->4,删除第3个节点assert(pos);assert(pos->next);SListNode* del = pos->next;SListNode* next = del->next;//pos->next->nextpos->data = del->data;pos->next = next;free(del);
}
void InsertFrontNode(SListNode* pos, DataType x)//在无头单链表的一个非头结点前插入一个节点
{//替换法//1->2->4->5第三个节点4前插入3,则4、5间插入3(1->2->4->3->5),再互换第三、四个节点值assert(pos);SListNode* tmp = _BuyNode(pos->data);tmp->next = pos->next;pos->next = tmp;//1->2->4->4->5tmp->data = x;//SListNode* tmp = _BuyNode(x);//tmp->next = pos->next;//pos->next = tmp;//DataType temp = pos->data;//pos->data = tmp->data;//tmp->data = temp;
}
SListNode* Rverse(SListNode* pHead)//逆置/反转单链表
{//头插思想,注意反转要检查该单链表是否为空//1->2->3->4新链表中依次取出1 2 3 4进行头插if (pHead == NULL){printf("SListNode is NULL!\n");return NULL;}SListNode* newHead = NULL;SListNode* cur = pHead;while (cur){SListNode* tmp = cur;cur = cur->next;tmp->next = newHead;newHead = tmp;}return newHead;
}
SListNode* FindMidNode(SListNode* pHead)//查找单链表的中间节点,要求只能遍历一次链表
{//利用快慢指针实现,快指针走2步的是慢指针走1步的2倍SListNode* fast = pHead;SListNode* slow = pHead;while (fast && fast->next){fast = fast->next->next;//链表总数为偶数时加上if返回较小数,无if时返回较大数if (fast == NULL)break;slow = slow->next;}//while (fast)//{ // if(fast->next)//     fast = fast->next->next;//   else break;//   slow = slow->next;//}return slow;
}
SListNode* FindMidNode(SListNode* pHead, DataType k)//查找单链表的倒数第k个节点,要求只能遍历一次链表
{//快慢指针,快指针走k步,慢指针走一步,之后同速度走SListNode* fast = pHead;SListNode* slow = pHead;while (k-- && fast)fast = fast->next;if (k == -1){while (fast){slow = slow->next;fast = fast->next;}}elsereturn NULL;//while (k-- && fast)//{//    fast = fast->next;//    if (fast == NULL)//       return NULL;//}//while (fast)//{//  slow = slow->next;//    fast = fast->next;//}return slow;
}

各函数测试用例如下:

void Test4()
{//【面试题一】从尾到头打印单链表SListNode *phead = NULL;PushBack_Cpp(phead, 1);PushBack_Cpp(phead, 2);PushBack_Cpp(phead, 3);PushBack_Cpp(phead, 4);PushBack_Cpp(phead, 5);PushBack_Cpp(phead, 6);PrintSList(phead);printf("\n---------------------\n");PrintTailToHead(phead);printf("NULL");
}void Test5()
{//【面试题二】删除一个无头单链表的非尾节点SListNode *phead = NULL;PushBack_Cpp(phead, 1);PushBack_Cpp(phead, 2);PushBack_Cpp(phead, 3);PushBack_Cpp(phead, 8);PushBack_Cpp(phead, 4);PushBack_Cpp(phead, 5);PrintSList(phead);printf("\n---------------------\n");DelNonTailNode(Find(phead, 8));PrintSList(phead);DestoryList(phead);
}void Test6()
{//【面试题三】在无头单链表的一个非头结点前插入一个节点SListNode *phead = NULL;PushBack_Cpp(phead, 1);PushBack_Cpp(phead, 2);PushBack_Cpp(phead, 4);PushBack_Cpp(phead, 5);PushBack_Cpp(phead, 6);PrintSList(phead);printf("\n---------------------\n");InsertFrontNode(Find(phead, 4), 3);PrintSList(phead);DestoryList(phead);
}void Test7()
{//【面试题四】逆置/反转单链表SListNode *phead = NULL;PushBack_Cpp(phead, 1);PushBack_Cpp(phead, 2);PushBack_Cpp(phead, 3);PushBack_Cpp(phead, 4);PrintSList(phead);printf("\n---------------------\n");SListNode *newphead = Rverse(phead);PrintSList(newphead);DestoryList(phead);
}void Test8()
{//【面试题五】查找单链表的中间节点,要求只能遍历一次链表SListNode *phead = NULL;PushBack_Cpp(phead, 2);PushBack_Cpp(phead, 3);PushBack_Cpp(phead, 4);PushBack_Cpp(phead, 5);PushBack_Cpp(phead, 6);PushBack_Cpp(phead, 7);PrintSList(phead);printf("\n---------------------\n");printf("%d\n",FindMidNode(phead)->data);DestoryList(phead);
}void Test9()
{//【面试题六】查找单链表的倒数第k个节点,要求只能遍历一次链表SListNode *phead = NULL;PushBack_Cpp(phead, 1);PushBack_Cpp(phead, 2);PushBack_Cpp(phead, 3);PushBack_Cpp(phead, 5);PushBack_Cpp(phead, 6);PushBack_Cpp(phead, 7);PrintSList(phead);printf("\n---------------------\n");SListNode *pos = FindMidNode(phead, 3);printf("%d\n",pos->data);DestoryList(phead);
}
int main()
{Test4();printf("\n***********************\n");Test5();printf("\n***********************\n");Test6();printf("\n***********************\n");Test7();printf("\n***********************\n");Test8();printf("\n***********************\n");Test9();system("pause");
}

本文出自 “Scen” 博客,请务必保留此出处http://10741357.blog.51cto.com/10731357/1736395

【面试题】单链表的操作1相关推荐

  1. java实现单链表常见操作,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...

  2. 笔试面试常考数据结构-单链表常用操作编程实现

    单链表是笔试以及面试手写代码中常考的数据结构之一.下面实现了单链表的常见操作:创建单链表.删除节点.打印单链表(包括正向打印以及逆向打印).反转单链表.找出单链表的倒数第K个节点.合并两个有序单链表等 ...

  3. java实现单链表常见操作

    一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...

  4. 单链表创建及代码实现对单链表的操作

    链表:链表是一个有序的列表:是以节点的方式存储的,是链式存储:其中每一个节点包含data域,next域,next域指向下一个节点:链表的各个节点不一定是连续存放的:链表分带有头节点的链表和没有头节点的 ...

  5. 数据结构(5)之单链表的操作(补充)

    1 前言 上次我们讲到单链表的存储和一些简单的算法,今天我们来学习一下单链表的初始化和销毁操作. 2 详述 2.1 单链表的整表创建 思路: ·声明一结点p和计数器变量i; ·初始化一空链表L: ·让 ...

  6. c语言单链表数据显示,C++_C语言单链表常见操作汇总,C语言的单链表是常用的数据结 - phpStudy...

    #include #include //定义单链表结构体 typedef int ElemType; typedef struct Node { ElemType data; struct Node ...

  7. Java实现单链表反转操作

    单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据.二是指针域,用于存储下一个节点的地址.在Java中定义如下: public class ...

  8. python 单链表的操作

    链表由一系列不必在内存中相连的结构构成,这些对象按线性顺序排序.每个结构含有表元素和指向后继元素的指针.最后一个单元的指针指向NULL.为了方便链表的删除与插入操作,可以为链表添加一个表头. 单链表 ...

  9. 数据结构 - 单链表(百度面试题单链表的倒序打印)

    方法1:反转打印(但是会改变链表结构,不建议) https://blog.csdn.net/weixin_43736084/article/details/101939789 方法2:存入栈中,在出栈 ...

  10. 面试题----单链表实现栈

    编程实现下面的栈顶操作: class MyData {void push(data);void pop(&data);bool isEmpty(); }; 解析:显然这里需要实现栈的3种基本操 ...

最新文章

  1. 图解使用Ant构建一个Java项目
  2. TCL with SNPS file existsfile rename/copy redirect lsearch split
  3. Hadoop2.6.0子项目hadoop-mapreduce-examples的简单介绍
  4. 使用openssl生成双向加密证书(转)
  5. 设计模式之适配器模式(Adapter Pattern)
  6. python语言保留字的特点_python保留字及其说明
  7. 垃圾回收(三)-gc模块
  8. linux getline参数,[置顶]linux getline()函数
  9. mysql启动提示 access denied for user root@localhost(using password:YES) 解决办法总结
  10. 想要导航提示页最新安卓区_2020年网站页头设计:最佳实践及案例
  11. 计算机三级数据库应用题设计题,计算机考试三级数据库练习题
  12. vimdiff解决git merge冲突
  13. Linux-网络命令
  14. 谷歌提前关闭 G+;春运 12 天后开售,“候补购票”功能将上线 12306
  15. 信息安全实验:标准IP的ACLs的配置(cisco模拟器)
  16. 工程管理系统企业工程管理系统简介
  17. Jquery文本域(textarea)改变事件
  18. 长难句——考研英语刘晓燕#2
  19. 机器人的研究,主要经历了哪几代历程?
  20. 冯·诺依曼的遗产:寻找人工生命的理论根源

热门文章

  1. 随机产生一个五位数以内的数
  2. 紫光服务器管理口装系统,紫光一键重装系统步骤方法
  3. 腾讯御安全之AI反病毒引擎白皮书
  4. java学习之htlm总结
  5. 完全用 GNU/Linux 工作(原版)
  6. QTableWidget获取一行数据
  7. python12306学生票抢票脚本下载_Python 12306抢火车票脚本 Python京东抢手机脚本
  8. 《编程之道》译者序(转载) (转)
  9. Windows系统如何关闭防火墙保姆式教程,超详细
  10. 《杀死一只知更鸟》哪个译本好?