您的位置:首页 > 理论基础 > 数据结构算法

第二章:线性表 课后习题整理 数据结构与算法 --张铭

2018-04-03 21:33 621 查看
1.试设计一个非递归算法在O(n)时间内将一个含有n个元素的单链表逆置(C++)请问如何构建一个单链表,要求其辅助空间为常量。
方法一:头插法重新建表(头插法:将头结点摘下,然后从第一个节点开始,依次插入到头结点的后面,直到最后一个结点为止。LinkList Reverse(LinkList L){
//L是带头结点的单链表,本算法将L就地逆置
LNode *p ,*r; //p为工作指针,r为p的后继,以防断链
p = L->next; //从第一个元素结点开始
L->next = NULL; //先将头结点L的next域置为NULL
while(p != NULL){ //依次将元素结点摘下
r = p->next; //暂存p的后继
p->next = L->next; //将p结点插入到头结点之后
L->next = p; //
p = r; //
}
return L;
}其他解法请自行google
2.给定一个单向链表,试设计一个既省时间又节省空间的算法来找出该该链表的倒数第m个元素。
经典题目:两个指针,一前一后。时间复杂度O(n),空间复杂度O(1)LNode* FindMToLastNode(LNode* pHead, int m)
{
// 查找到第m个元素
LNode* pCurrent = pHead;
for (int i = 0; i < m; ++i)
{
if (pCurrent)
{
pCurrent = pCurrent->next;
}
else
{
return NULL;
}
}

// 一起继续遍历到链表尾部,
// 现在pFind和pCurrent之间间隔了m个元素,
// 所以,当pCurrent遍历到尾部的时候,
// pFind就到了倒数第m个元素的位置上.
LNode* pFind = pHead;
while (pCurrent)
{
pFind = pFind->next;
// 间隔m个元素
pCurrent = pCurrent->next;
}

return pFind;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: