翻转链表的三种方法
- 每次遍历从最后一个节点插入最前面
- 使用三个指针原地不动翻转链表
- 递归法翻转链表
接下来进行一一叙述
(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;
}
}
好了 以上就是对链翻转方法的总结,