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

来源:互联网 发布:网络设计与管理华软 编辑:程序博客网 时间:2024/06/10 03:13

问题一

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

考虑: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;}