史上最详细的单链表反转(linux c)

因为之前对链表反转这一块一直记忆不清,现在复习总结一下,只要还是要了解复习指针地址操作,结构体定义。

方法1:采用前插得方法,把节点从前边取出来然后再插到前边;分三步(具体看分解图)

              <一>先将第一个数字节点和头断开,然后接到链表最后

              <二>然后按照上边的方法把剩下的链表中的节点一个接一个的插到前边

              <三>直到将所有的节点插完,然后将新的头结点和head相连


先上完整的反转代码。。链表中存入了15个数

*********************************************************************************************************************

void fanxu(list *plist) 

{

    //标记首先需要的三个节点
list *pwei=plist;
list *per=plist->pnext;
list *ptemp=NULL;

while(pwei->pnext!=NULL)
{
pwei=pwei->pnext;
}
while(pwei!=per)
{
ptemp=per;            //永远标记第二个节点
per=per->pnext;
        
//第一次要把链表头断掉
if(pwei->pnext==NULL)
{
            pwei->pnext=ptemp;
ptemp->pnext=NULL;   //断掉
}
else
{
    ptemp->pnext=pwei->pnext;    //前插
    pwei->pnext=ptemp;             //然后再一块接到尾指针

}

plist->pnext=per;          //为了打印显示,可以省
printf("per-jietou--<qiancha>****************************************************************************************\n");
showlist(plist);
plist->pnext=pwei;         //为了打印显示,可以省
printf("pwei-jietou--<qiancha>***************************************************************************************\n");
showlist(plist);
printf("\n\n\n");
   } 
    plist->pnext=per;
}

****************************************************************************************************************

第一步:<一>先将第一个数字节点和头断开,然后接到链表最后

第二步:<二>然后按照上边的方法把剩下的链表中的节点一个接一个的插到前边




………

 第三步: <三>直到将所有的节点插完,然后将新的头结点和head相连

########################################################################################方法2:在方法1的基础上改进简化(创建新标志位)  主要理解while(p)是判断节点p的地址,p=q 是地址之间的重新赋值

           <一>定义三个新的节点标志位p q pr  将链表的前一个节点插下来;

           <二> 然后将节点插到一个新的标志位后边,同样的方法插后边的节点

           <三>插完之后将新的标志位连接到之前的头结点打印

****************************************************************************************************************

void fanxu_gao(list *plist)
{
list *pr;
list *p=plist->pnext;
        list *q=NULL;


plist->pnext =NULL;
while(p)
{
         pr=p->pnext;  //记录第二个地址
  p->pnext=q;
  q=p;    //可以理解成给q和p重新赋值新地址

  p=pr;   //标记第二个地址


plist->pnext=q;     //打印显示,可以没有
printf("qqqqqqqqqqqqqqqqqg#############################################\n");
showlist(plist);

plist->pnext=p;      // 打印显示可以没有
printf("ppppppppppppppppppppz#############################################\n");
showlist(plist);
printf("\n\n\n");
}
plist->pnext=q;
}

************************************************************************************************************************

<一>定义三个新的节点标志位p q pr  将链表的前一个节点插下来;


<二> 然后将节点插到一个新的标志位后边,同样的方法插后边的节点


 <三>插完之后将新的标志位连接到之前的头结点打印


***************************************************************************************************************************
Logo

更多推荐