链表翻转的是三种方法

来源:互联网 发布:软件的盈利模式 编辑:程序博客网 时间:2024/06/14 05:31
翻转链表的三种方法
  • 每次遍历从最后一个节点插入最前面
  • 使用三个指针原地不动翻转链表
  • 递归法翻转链表
    接下来进行一一叙述
(1)对于第一中方法比较笨拙,思路是:首先遍历到链表的最后一个节点,将最后一个节点插入头节点的后面,接着循环上述操作一一进行插入,知道只剩下一个节点为止。
void ReserveList(pListNode pHead){    pListNode p = pHead;    pListNode pPre = pHead;    pListNode pTail = pHead->next;    while (p->next->next != NULL)    {        while (pTail->next)        {            pPre = pTail;            pTail = pTail->next;        }        pPre->next = NULL;        pTail->next = p->next;        p->next = pTail;        p = pTail;    }}
(2)第二种方法比较简单,且操作简单,容易理解。思路为:首先定义三个指分别 Pre(表示当前指针的前驱初值为NULL),pCur(当前节点指针),pNext(当前节点的下一个指针),每当当前指针不为空时就会把当前指针直线前驱指针,直到当前指针为空。
void ReserveList(pListNode pHead){    pListNode pre = NULL;    pListNode pNext = NULL;    pListNode pCur = pHead->next;    while (pCur)    {        pNext = pCur->next;        pCur->next = pre;        pre = pCur;        pCur = pNext;    }    pHead->next = pre;}
(3)第三种方法即递归方法我感是最简单的方法,但是自我认为理解起来也比较简单,可能自己对递归方面做的题目比较多,所以理解起来比较简单,该方法思路为:当求全部链表的翻转时,只要把除当前指针外后面的指针翻转,然后再把当前指针放在翻转后的指针后面就行了,即把链表从更大范围翻转缩小更小范围
pListNode ReserveList(pListNode  p, pListNode pStaticHead){       if (pStaticHead == NULL)    {        return NULL;    }    if (p->next == NULL)    {        pStaticHead->next = p;        return p;    }    else    {        pListNode temp = ReserveList(p->next,pStaticHead);        temp->next = p;        p->next = NULL;        return p;    }}

好了 以上就是对链翻转方法的总结,

原创粉丝点击