单链表的基本操作(面试题)
来源:互联网 发布:淘宝v3会员是什么级别 编辑:程序博客网 时间:2024/04/20 04:36
title:单链表的基本操作(面试题)
链表的基本操作是初学数据结构的必要练习,也是公司面试时的热门考点
以下是个人总结的不全面一些操作,在这里分享。
include<assert.h>include<stdio.h>include<stdlib.h>include<malloc.h>//#pragma warning (disable:4996);typedef int DataType;typedef struct Node{struct Node* next;DataType data;}Node ,*PNode;//初始化单链表void InitList(PNode* pHead);//创建一个新节点PNode BueNode(DataType data); //尾插一个节点void PushBack(PNode* pHead,DataType data); //尾删一个节点void PopBack(PNode* pHead); //打印链表void PrintList(PNode pHead); //从尾到头打印单链表void PrintListFromTailtoHead(PNode pHead); //头插一个节点void PushFront(PNode* pHead,DataType data); //头删一个节点void PopFront(PNode* pHead); //寻找链表中第一个值域是data的节点PNode Find(PNode pHead,DataType data);//在pos位置后插入void Insert(PNode pos,DataType data); //在pos位置前插入void InsertNotHeadNode(PNode pos,DataType data);//删除一个节点void Erase(PNode* pHead,PNode pos);void Remove(PNode* pHead , DataType data);//删除一个无头单链表的非尾节点void DeleteNotTailNode(PNode pos);//删除所有值为data的节点void RemoveAll(PNode* pHead , DataType data);//得出链表大小int Size(PNode pHead);//找最后一个节点PNode Back(pHead);//判断两个个链表是否交叉 int IsListCross(PNode pHead1,PNode pHead2);//判断两个个链表是否交叉 并求交点PNode GetCrossNode(PNode pHead1,PNode pHead2);//是否带环PNode HasCircle(PNode pHead);//环周长int GetCircleLen(PNode pMeetNode);//判断两个可能带环的链表是否相交。int IfCrossWithCricle(PNode pHead1,PNode pHead2);//获得带环单链表的入口点PNode GetEnterNode(PNode pHead,PNode pMeetNode);//逆置单链表PNode Reverse(PNode pHead);//单链求解拟约瑟夫环(表已成环)PNode Josephcircle(PNode pHead,int n);void InitList(PNode* pHead){ assert(pHead); *pHead = NULL;}PNode BueNode(DataType data){ PNode pTemp = (PNode)malloc(sizeof(Node)); if(pTemp) { pTemp->data = data; pTemp->next = NULL; } return pTemp;}void PushBack(PNode* pHead,DataType data){ assert(pHead); if(NULL == *pHead) *pHead = BueNode(data); else{ /* PNode pCur = *pHead; while(pCur->next){ pCur = pCur->next; } pCur->next = BueNode(data);*/ PNode pCur = *pHead; PNode pPre = pCur; while(pCur){ pPre = pCur; pCur = pCur->next; } pPre->next = BueNode(data); }}void PushFront(PNode* pHead,DataType data){ PNode pNewNode = BueNode(data); assert(pHead); if(pNewNode){ pNewNode->next = *pHead; *pHead = pNewNode; }}void PopFront(PNode* pHead){ PNode pDel = NULL; assert(pHead); if(NULL == *pHead) return ; pDel = *pHead; *pHead = (*pHead)->next; free(pDel);}void PopBack(PNode* pHead){ assert(pHead); if(NULL == *pHead){ return ; } else if(NULL == (*pHead)->next){ free(*pHead); *pHead = NULL; } else{ PNode pCur = *pHead; PNode pNewTail = NULL; while(pCur->next->next){ pCur = pCur->next; } pNewTail = pCur; free(pCur->next); pNewTail->next = NULL; }}void PrintList(PNode pHead){ PNode pCur = pHead; while(pCur){ printf("%d->",pCur->data); pCur = pCur->next; } printf("NULL"); printf("\n");}//用递归思想解决void PrintListFromTailtoHead(PNode pHead){ //if(NULL == pHead){return ;} //PrintListFromTailtoHead(pHead->next); //printf("%d->",pHead->data); if(pHead){ PrintListFromTailtoHead(pHead->next); printf("%d->",pHead->data); }} PNode Find(PNode pHead,DataType data){ PNode pCur = pHead; assert(pHead); while(pCur){ if(pCur->data == data) return pCur; pCur = pCur->next; } return NULL;}void Insert(PNode pos,DataType data){ PNode pNewNode = NULL; assert(pos); if(NULL == pos){return;} pNewNode = BueNode(data); pNewNode->next = pos->next; pos->next = pNewNode;}void Erase(PNode* pHead,PNode pos){ assert(pHead); if(NULL == *pHead || NULL == pos) return; if(pos == *pHead){ *pHead = pos->next; free(pos); } else{ PNode pPre = *pHead; while(pPre->next != pos){ pPre = pPre->next; } pPre->next = pos->next; free(pos); }}void DeleteNotTailNode(PNode pos){ assert(pos); if(NULL == pos || NULL == pos->next) return ; pos->data = pos->next->data; pos->next = pos->next->next;}void InsertNotHeadNode(PNode pos,DataType data){ PNode pNewNode = BueNode(pos->data); if(NULL == pos ) return ; if(pNewNode){ pNewNode->next = pos->next; pos->next = pNewNode; pos->data = data; }}void Remove(PNode* pHead , DataType data){ assert(pHead); Erase(pHead,Find(*pHead,data));}void RemoveAll(PNode* pHead , DataType data){ PNode pPre = *pHead; PNode pCur = (*pHead)->next; assert(pHead); while(pCur) { if(pCur->data == data){ pPre->next = pCur->next; free(pCur); pCur = pPre->next; } else{ pCur = pCur->next; } } if((*pHead)->data == data) { pCur = *pHead; *pHead = (*pHead)->next; free(pCur); } }int Size(PNode pHead){ PNode pCurNode = pHead; int count = 0; while(pCurNode){ count++; pCurNode = pCurNode->next; } return count;}PNode Back(PNode pHead){ assert(pHead); while(pHead->next){ pHead = pHead->next; } return pHead;}//////////////////////////////////////////int IsListCross(PNode pHead1,PNode pHead2){ PNode pTailNode1 = pHead1; PNode pTailNode2 = pHead2; if(NULL == pHead1||NULL == pHead2) return 0; while(pTailNode1->next) pTailNode1 = pTailNode1->next; while(pTailNode2->next) pTailNode2 = pTailNode2->next; if(pTailNode1 == pTailNode2) return 1; return 0;}//逻辑分析图:![这里写图片描述]、、(http://img.blog.csdn.net/20170315001139787?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveF9fMDE2TWVsaW9yZW0=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)PNode GetCrossNode(PNode pHead1,PNode pHead2){ int count1 = 0; int count2 = 0; PNode pL1 = pHead1; PNode pL2 = pHead2; int gap = 0; if(NULL == pHead1||NULL == pHead2) return 0; if(0 == IsListCross( pHead1, pHead2)) return NULL; count1 = Size(pHead1); count2 = Size(pHead2); gap = count1 - count2; if(gap>0){ while(gap--){ pL1 = pL1->next; } } else{ while(gap++){ pL2 = pL2->next; } } while(pL1 != pL2){ pL1 = pL1->next; pL2 = pL2->next; } return pL2; }PNode HasCircle(PNode pHead){ PNode pFast = pHead; PNode pSlow = pHead; assert(pHead); while(pFast && pFast->next) { pFast = pFast->next->next; pSlow = pSlow->next; if(pFast == pSlow){ return pFast; } } return NULL;}int GetCircleLen(PNode pMeetNode){ PNode pCurNode = pMeetNode ; int count = 1; if(NULL == pMeetNode) return 0; while(pCurNode->next != pMeetNode){ count++; pCurNode = pCurNode->next; } return count;}PNode GetEnterNode(PNode pHead,PNode pMeetNode){ PNode pH = pHead; PNode pM = pMeetNode; if(NULL == pHead||NULL == pHead->next) return 0; while(pH != pM){ pH = pH->next; pM = pM->next; } return pH;}int IfCrossWithCricle(PNode pHead1,PNode pHead2)//判断两个可能带环的链表是否相交。{ PNode pMeetNode1 = HasCircle(pHead1); PNode pMeetNode2 = HasCircle(pHead2); if(NULL == pMeetNode1 && NULL == pMeetNode2){ return IsListCross(pHead1,pHead2);//判断两个个链表是否交叉 } else if(pMeetNode1 && pMeetNode2){ PNode pCur = pMeetNode1; while(pCur->next != pMeetNode2){ if(pCur == pMeetNode2){ return 2; } pCur = pCur->next; if(pCur == pMeetNode1) return 0; } if(pCur->next == pMeetNode2) return 2; } return 0;}PNode Reverse(PNode pHead){ PNode pPre = pHead; PNode pCur = pHead->next; PNode pnext = pCur->next; if(NULL == pHead || NULL == pHead->next ) return 0; while(pnext){ pCur->next = pPre; pPre = pCur; pCur = pnext; pnext = pnext->next; } pCur->next = pPre; pHead->next = NULL; return pCur;}PNode Josephcircle(PNode pHead,int n){ PNode pCur = pHead; if(NULL == pHead) return NULL; while(pCur->next != pCur){ PNode pDel = pCur->next; int count = n; while(--count){ pCur = pCur->next; pDel = pDel->next; } pCur->data = pDel->data; pCur->next = pDel->next; free(pDel); } return pCur;}
1 0
- 单链表的基本操作(面试题)
- (程序员面试题)链表的基本操作
- (程序员面试题)链栈的基本操作
- (程序员面试题)链队列的基本操作
- (程序员面试题)二叉树的基本操作
- 单链表基本操作及面试题
- 经典面试题---单链表的基本操作(C语言实现)
- 面试题:单链表的操作
- 二叉树的基本操作及部分面试题
- 二叉树的基本操作及部分面试题
- C语言实现单链表的基本操作及其部分面试题
- (单)链表的基本操作及常见面试题
- 单向链表的基本操作(常见面试题详解)
- 二叉树基本操作及面试题
- 二叉树基本操作以及面试题
- 链表基本操作及面试题
- 【面试题】单链表的操作1
- 【面试题】单链表的操作2
- JavaScript基础
- SG函数与组合博弈问题
- Java JDK安装与环境变量配置
- JSON格式转换成map并根据key值取值
- 在iphone上active伪类无效解决方法
- 单链表的基本操作(面试题)
- Linux—软件包管理
- MySQL优化三(InnoDB优化)
- mysql数据库zip版本的安装
- Spring源码
- 让你秒懂apache禁止网络爬虫采集的方法
- java基础 第四章 面向对象
- 如何在eclipse下查看jdk源码
- 1.1基本内置类型