//单链表翻转非递归法,返回翻转之后的头结点
//方法一、带有头指针的单链表,原理:将第二个节点到最后一个节点依次插入到头结点之后
ListNode* ListReverse(ListNode *head)
{
if(head==NULL)
return NULL;
ListNode *h=head;
ListNode *p=h->next;
h->next=NULL;//暂时将头结点与后面的结点断开
while(p!=NULL)
{
ListNode *q=p->next;//保存p结点之后的结点
p->next=h->next; //将第二个节点到最后一个节点依次插入到头结点之后
h->next=p;
p=q;
}
return h;
}
//方法二、无头结点的单链表,原理:改变指针指向。
//前一结点,当前结点,后一节点————>>当前结点的指针域指向前一结点
ListNode* ListReverse(ListNode* head)
{
ListNode *newhead=NULL;
ListNode *pNode=head;
ListNode *preNode=NULL;
while(pNode!=NULL)
{
ListNode *nextNode=pNode->next;
if(nextNode==NULL)
newhead=pNode;//指定新的头结点为最后一个节点
pNode->next=preNode;//当前结点指针指向前一结点
preNode=pNode;
pNode=nextNode;
}
return newhead;
}
//方法三、带有头结点的单链表
//原理:STEP1::判断为空或者一个结点;STEP2:先遍历head->next为首的链表,得到一个新的头结点
//STEP3:把原来的头结点加到新链表的尾部。即把head赋值给head->next->next,head->next为空。
//STEP4:返回新的头结点newhead.
ListNode* ListReverse(ListNode *head)
{
if(head==NULL||head->next==NULL)
return head;
ListNode *newhead=ListReverse(head->next);
head->next->next=head;
head->next=NULL;
return newhead;
}
单链表的翻转
最新推荐文章于 2022-07-13 11:26:58 发布