链表有关的题目
来源:互联网 发布:中电数据 李世峰 编辑:程序博客网 时间:2024/05/22 08:06
1、一个单链表,不知道长度,写一个函数快速找到中间节点的位置.
答:
【法1】
typedef struct linknode
{
int a;
struct linknode *next;
}linknode;
linknode *findmiddle(linknode *head)
{
linknode *fast,*low,*p;
if(head==NULL)
{
return NULL;
}
fast=low=head;
while(!(p=fast->next)&&!p->next)
{
low=low->next;
fast=p->next;
}
return low;
}
【法2】
void searchmid(node* hear, node *mid){
node *temp = head;
while(head->next->next != NULL){//此种方法只需在循环中记录移动一步的情况即可,然而此种算法存在问题:没有判断移动一步时是否节点指向NULL,因此我们需要在初始化时,对两需连续两个节点的next赋值为NULL(但是,相比于第一种方法,此种方法并不合适)
head = head->next->next;
temp = temp->next;
mid = temp;
}
}
2、写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).
答:两个指针,第一个先于第二个n个位置。
LinkNode IsLoopList(LinkNode *head,int n)
{
LinkNode *p1,*p2,*p3;
P1 = head;
While(n-->=0)
{
P3= p2->next;
P2 = p3;
}
While(p3->next!=NULL)
{
P3 = p3->next;
P1 = p1->next;
}
Return p1; //当p3到达结尾时,后于p3n个位置的就是倒数第n个节点。
}
3、判断链表是否存在循环
答:bool IsLoopList(LinkNode *head)
{
LinkNode *p1= head,*p2= head;
if(head ->next==NULL)//只包含头节点,且头节点的next为NULL说明肯定不是循环链表
return false;
do{
p1=p1->next; //步长为1
p2=p2->next->next; //步长为2
}while(p2 && p2->next && p1!=p2);
if(p1==p2)
return true;
else
return false;
}
- 链表有关的题目
- 数据结构中有关链表的题目
- 有关牌的题目
- 有关栈的题目
- 有关字符串的题目
- 数据库的有关练习题目
- 一道有关static的题目
- POJ有关搜索的题目
- LeedCode种有关链表List题目总结一
- LeedCode种有关链表List题目总结二
- 一道有关图论的题目
- 有关函数指针的小题目
- 一道与预处理有关的题目
- 有关于volatile的说明(含题目)
- 一些和期望有关的题目
- 数组和指针有关sizeof的题目
- 杭电acm有关string的题目
- 有关二维数组的PAT题目
- .NET正则基础之——平衡组
- java文件操作总汇
- ASP.NET(C#)通用数据库类
- Microsoft Team Foundation Server 2008 Power Tools
- oracle数据还原与备份
- 链表有关的题目
- Linux的变量可分为两类:环境变量和本地变量
- epoll在ET模式下的一些注意事项
- 定义判断题--总结
- JS代码:在select插入option
- JSP简介
- C for linux 更改当前工作目录函数 chdir 或 fchdir
- java的native方法
- 再再论指针小结