您的位置:首页 > Web前端 > Node.js

【链表】反转/逆置 链表,以及升级版Node* RotateList(Node* list, size_t k)

2017-07-14 11:42 375 查看

问题一

问题描述:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

考虑:1只有一个结点。2、链表为空

//思路:定义三个指针,改变链表结点的指向
//考虑 1一个结点,没有及诶单
Node *ReverseList(Node* pHead)
{
Node* ReverseHead = NULL;
Node* pNode = pHead;
Node* pPrev = NULL;
while (pNode != NULL)
{
Node *pNext = pNode->_next;
if (pNext == NULL)
ReverseHead = pNode;
pNode->_next = pPrev;
pPrev = pNode;
pNode = pNext;
}
return ReverseHead;
}


问题二:升级版

链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现Node* RotateList(Node* list, size_t k). 提示:这个题是链表逆置的升级变型。

分析问题

思路:链表中长度为k的一段从链表中摘除,翻转之后在将其衔接回链表。

步骤:1、找到k长的链表

2、从原来链表上摘取下来

3、逆置新的链表

4、连接到原来的链表上

循环上面的四个步骤,直到链表的长度不够k。

Node* GetTail(Node *pHead)
{
assert(pHead);
Node* pNode = pHead;
while (pNode->_next != NULL)
{
pNode = pNode->_next;
}
return pNode;
}
Node* RotateList(Node* pHead, size_t k)
{
if (k <= 1)
return pHead;
Node *pNewList = NULL;
Node *pLastNode = NULL;//记录上一段链表的末尾
Node *pNextNode = NULL;//k链表的下一个节点
Node *pNewHead = NULL; //新链表的头
Node *pNode = pHead;
while (pNode)
{
//找出长度为k的一段链表
pNewHead = pNode;
size_t pos = 1;
while (pNode && pos < k)
{
pNode = pNode->_next;
pos++;
}
if (pos == k && pNode != NULL)
{
//找到的长度k的一段链表,逆置这段链表
pNextNode = pNode->_next;
pNode->_next = NULL;
//断开新链表与原来的链表
if (NULL != pLastNode)
pLastNode->_next = NULL;

pNewHead = ReverseList(pNewHead);
//将这段链表连接到原来的链表上 1和2
//1、将新链表的头 链到原来的链表
if (pLastNode == NULL)
{
pNewList = pNewHead;
}
else
{
pLastNode->_next = pNewHead;
}
//2、将新链表的尾 连接到原来的链表上
//找新链表的尾
pNode = GetTail(pNewHead);
pNode->_next = pNextNode;
pLastNode = pNode;
pNode = pNextNode;//开始下一轮找k长链表
}
else
break;
}
return pNewList;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: