【面试经典题之链表】
2016-03-11 20:03
357 查看
1、编写代码,移除未排序链表中的重复节点(不使用临时缓冲区)
答题:使用两个指针,一个指针指向当前节点,另一个指针检测当前节点之后的所有节点,当检测指针检测到与当前节点重复的节点时,删除该节点。
void Deletesame(Node *head)
{
if(head==NULL)
return;
Node *p=head;
while(p!=NULL)
{
Node *q=p;
while(q->next!=NULL)
{
if(q->next->data==p->data)
{
q->next=q->next->next;
}
else
{
q=q-next;
}
}
p=p->next;
}
}
2、实现一个算法,找到一个单向链表中倒数第k个节点。
答:制定两个指针,一开始两个都指向链表第一个节点,这时第一个指针不动,第二个指针往后找当前节点后的第k-1个节点,如果第二个指针的next为空,那么说明当前第一个指针为链表的倒数底k个节点。
Node* whenkreturn(Node *head,int k)
{
Node *p,*q;
p=q=head;
while(p!=NULL)
{
for(int i=0;i<k-1;i++)
{
if(q->next==NULL)
return null;
q=q->next;
}
if(q->next==NULL)
return p;
p=p->next;
}
}
3、实现一个算法,删除单向链表中的某个节点,假设你只能访问该节点。
答:将节点的下一节点复制给该节点,删除下一节点。
bool deletenode(Node *p)
{
if(p==NULL||p->next==NULL)
{
return false;
}
p->data=p->next->data;
p->next=p->next->next;
return true;
}
4、链表逆置算法。
void swap(node *head)
{
int i=1;
node *tail,*p;
int temp;//假设节点的数据域是int型的
tail=head;
while(tail!=NULL)
{
tail=tail->next;
i++;
}
while(i>1)
{
p=head;
for(int j=0;j<i-1;j++)
{
t=p->data;
p->data=p->next->data;
p->next->data=t;
p=p->next;
}
i--;
}
}
ps:这个算法不是最好的,看得懂就看,看不懂就算了吧。。。其实最易理解的算法就是另外定义一条链表,然后将原来的链表逆置地复制过去。。。
答题:使用两个指针,一个指针指向当前节点,另一个指针检测当前节点之后的所有节点,当检测指针检测到与当前节点重复的节点时,删除该节点。
void Deletesame(Node *head)
{
if(head==NULL)
return;
Node *p=head;
while(p!=NULL)
{
Node *q=p;
while(q->next!=NULL)
{
if(q->next->data==p->data)
{
q->next=q->next->next;
}
else
{
q=q-next;
}
}
p=p->next;
}
}
2、实现一个算法,找到一个单向链表中倒数第k个节点。
答:制定两个指针,一开始两个都指向链表第一个节点,这时第一个指针不动,第二个指针往后找当前节点后的第k-1个节点,如果第二个指针的next为空,那么说明当前第一个指针为链表的倒数底k个节点。
Node* whenkreturn(Node *head,int k)
{
Node *p,*q;
p=q=head;
while(p!=NULL)
{
for(int i=0;i<k-1;i++)
{
if(q->next==NULL)
return null;
q=q->next;
}
if(q->next==NULL)
return p;
p=p->next;
}
}
3、实现一个算法,删除单向链表中的某个节点,假设你只能访问该节点。
答:将节点的下一节点复制给该节点,删除下一节点。
bool deletenode(Node *p)
{
if(p==NULL||p->next==NULL)
{
return false;
}
p->data=p->next->data;
p->next=p->next->next;
return true;
}
4、链表逆置算法。
void swap(node *head)
{
int i=1;
node *tail,*p;
int temp;//假设节点的数据域是int型的
tail=head;
while(tail!=NULL)
{
tail=tail->next;
i++;
}
while(i>1)
{
p=head;
for(int j=0;j<i-1;j++)
{
t=p->data;
p->data=p->next->data;
p->next->data=t;
p=p->next;
}
i--;
}
}
ps:这个算法不是最好的,看得懂就看,看不懂就算了吧。。。其实最易理解的算法就是另外定义一条链表,然后将原来的链表逆置地复制过去。。。
相关文章推荐
- leetcode之Minimum Height Trees
- 剑指offer代码解析——面试题11求a的b次方
- 剑指offer代码解析——面试题11求a的b次方
- 面试后一点反思和毕设计划
- [.Net码农]DragDrop 注册失败的问题
- 程序员编程能力层次模型
- 最新前端开发面试题集合(非常全面)
- 数据库笔试和面试小结
- 程序员的春天来了,赏花去!说走就走
- 程序员的春天来了,最美赏花旅游地十大攻略
- 一起来做品质宅:漫话程序员们的家庭装修
- 第一篇CSDN博客,记录准备面试的种种
- 程序员必须知道的10大基础实用算法及其讲解
- 程序员如何写出牛掰的简历
- 如何写出程序员无法维护的代码?
- 软件测试职业发展方向
- 漫话程序员们的家庭装修——书房篇
- android面试题
- android面试题
- 阿里面试准备<android部分>