编程之美三——单链表
来源:互联网 发布:精英光电 软件 编辑:程序博客网 时间:2024/04/30 10:33
链表由一系列不必在内存中相连的结构组成,每一个结构均含有表元素和指向包含该元素后继元的结构指针。最后一个元素的后继指针指向NULL。
该结构(又称为结点)由两个域组成:数据域和指针域,数据域存储数据元素信息,指针域存储后继结点的地址。
链表的实现
typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList;
面试题一:输入一个头结点,从尾到头反过来打印出每个结点的值
//可以用栈来实现,,每经过一个结点的时候,把该结点放到一个栈中//遍历完整个链表的时候再从栈顶开始逐个输出结点的值void printReverseList(LinkList phead){if(phead==NULL)return;stack<LinkList>nodes;LinkList pnode=phead;while(pnode!=NULL){nodes.push(pnode);pnode=pnode->next;}while(!nodes.empty()){pnode=nodes.top();printf("%d\t",pnode->data);nodes.pop();}}
面试题二:链表中倒数第K个结点
//设置两个指针,一前一后,先让前面那个指针移动K步//然后连个指针同时移动,当前面那个指针移动到末尾的时候//后面的指正正好指向倒数第K个结点LinkList findKthNode(LinkList phead,int k){if(LinkList==NULL&&k==0)return NULL;LinkList pAhead=phead;LinkList pBehind=phead;if(int i=0;i<k-1;++i){if(pAhead->next!=NULL)pAhead=pAhead->next;elsereturn NULL;}while(pAhead->next!=NULL){pAhead=pAhead->next;pBehind=pBehind->next;}return pBehind;}
类似的还有求一个链表的中间结点,判断一个单向链表是否有环;
//找出链表的中间结点且当中间结点有两个时取第一个;LinkList findMiddle(LinkList list){LinkList temp=list->next;if(NULL==temp)return NULL;LinkList pHead=list->next;while(pHead->next!=NULL&&pHead->next->next!=NULL){pHead=pHead->next->next;temp=temp->next;}return temp;}
面试题三:反转链表
LinkList reverseList(LinkList head){LinkList reversehead=NULL;LinkList node=head->next;LinkList pre=NULL;//保存当前结点的前一个结点;while(node!=NULL){LinkList pNext = node->next;if(pNext==NULL)reversehead=node;node->next=pre;pre=node;node=pNext;}return reversehead;}
面试题四:合并两个已经排序好的链表(递归实现)
LinkList mergeList(LinkList headA,LinkList headB){if(NULL==headA)return headB;if(NULL==headB)return headA;LinkList mergeHead=NULL;if(headA->data<headB->data){mergeHead=headA;mergeHead->next = mergeList(headA->next,headB);}else{mergeHead=headB;mergeHead->next = mergeList(headA,headB->next);}return mergeHead;}
面试题五 约瑟夫环(循环链表)
在1,2......n的n个数字中每次删除第m个数字,求最后剩下的数字是多少
//每次删除第m个元素int lastRemaining(int n,int m){LinkList list=creatCircle(n);LinkList node=list;LinkList p=list;while(node!=node->next){for(int i=1;i<=m-2;i++){node=node->next;}//删除第m个元素;LinkList deleteNode = node->next;node->next=deleteNode->next;free(deleteNode);node=node->next;}return node->data;}//创建约瑟夫环LinkList creatCircle(int nNode){LinkList head,node;head = (LinkList)malloc(sizeof(LNode));node=head;for(int i=1;i<=nNode;i++){LinkList temp = (LinkList)malloc(sizeof(LNode));temp->data=i;node->next=temp;node=temp;}node->next=head->next;//循环链表队尾指针指向头指针free(head);return node->next;}
0 0
- 编程之美三——单链表
- 编程之美—读后感
- 编程之美系列之三——计算1的个数
- 编程之美系列之三——计算1的个数
- 《编程之美》读书笔记(三)——阶乘结果末尾"0"的个数
- 编程之美2.1 解法三
- 编程之美读书笔记——目录
- 编程之美——2.7最大公约数
- 编程之美——数字哑谜
- 编程之美——循环移位
- 编程之美——最大公约数问题
- 编程之美——饮料供货
- 《编程之美》——读书笔记
- 编程之美——CPU正弦曲线
- 编程之美——饮料供货
- 编程之美——CPU占用率
- 编程之美—— Combination Sum
- 《编程之美》——CPU使用率
- Apache Shiro权限框架在SpringMVC+Hibernate中的应用
- Android开发之HttpClient
- LintCode-寻找缺失的数
- 使用slf4j来打印异常
- java实现:md5加密
- 编程之美三——单链表
- SpringMVC+Spring+Hibernate+EHCache
- A. Vanya and Table
- android 检测网络状况
- IOS知识点小结
- leetcode-13Roman to Integer
- 三大框架原理说明
- MyEclipse之Widget is disposed
- 美图秀秀制作透明背景的图标