前两天看到一个题目,将链表反转,我的第一思路是将列表放入栈中,然后再依次拿出来。
思想过于简单,我想到说利用数组来实现这个功能。之后查看网上各种大神的方法,做以下几个方法总结。
一、放入数组,数组倒置
void reverse(pnode head, int count)//把链表的节点值放在数组中,倒置数组
{
int a[5]= {0};
for(int i=0; i<count,head->pnext!=NULL; i++)
{
a[i]=head->pnext->data;
head=head->pnext;
}
for(int j=0,i=count-1; j<count; j++,i--)
printf("%d\t",a[i]);
}
二、遍历到链表的最后一个节点,将最后一个节点插入头节点的后面,接着循环进行插入,直到只剩下一个节点为止
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;
}
}
三、首先定义三个指分别 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;
}
四、递归:当求全部链表的翻转时,只要把除当前指针外后面的指针翻转,然后再把当前指针放在翻转后的指针后面就行了,即把链表从更大范围翻转缩小更小范围
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;
}
}
https://blog.csdn.net/qq_36675830/article/details/78064488?readlog
https://blog.csdn.net/qq_36675830/article/details/78064488?readlog