奔跑的蜗牛0 发表于 2019-9-25 13:15

单链表(linux c)

  因为之前对链表反转这一块一直**不清,现在复习总结一下,只要还是要了解复习指针地址操作,结构体定义。
  方法1:采用前插得方法,把节点从前边取出来然后再插到前边;分三步(具体看分解图)
  <一>先将第一个数字节点和头断开,然后接到链表最后
  <二>然后按照上边的方法把剩下的链表中的节点一个接一个的插到前边
  <三>直到将所有的节点插完,然后将新的头结点和head相连
  先上完整的反转代码。。链表中存入了15个数

https://common.cnblogs.com/images/copycode.gif
  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--****************************************************************************************\n");
  showlist(plist);
  plist->pnext=pwei; //为了打印显示,可以省
  printf("pwei-jietou--***************************************************************************************\n");
  showlist(plist);
  printf("\n\n\n");
  }
  plist->pnext=per;
  }

https://common.cnblogs.com/images/copycode.gif
  第一步:<一>先将第一个数字节点和头断开,然后接到链表最后

https://img2018.cnblogs.com/blog/1779408/201909/1779408-20190925115006240-1070658699.png
  第二步:<二>然后按照上边的方法把剩下的链表中的节点一个接一个的插到前边

https://img2018.cnblogs.com/blog/1779408/201909/1779408-20190925115022021-684198345.png
  ………
  第三步: <三>直到将所有的节点插完,然后将新的头结点和head相连

https://img2018.cnblogs.com/blog/1779408/201909/1779408-20190925115039501-293801836.png
  ########################################################################################
  方法2:在方法1的基础上改进简化(创建新标志位) 主要理解while(p)是判断节点p的地址,p=q 是地址之间的重新赋值
  <一>定义三个新的节点标志位p q pr 将链表的前一个节点插下来;
  <二> 然后将节点插到一个新的标志位后边,同样的方法插后边的节点
  <三>插完之后将新的标志位连接到之前的头结点打印
  ****************************************************************************************************************

https://common.cnblogs.com/images/copycode.gif
  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;
  }

https://common.cnblogs.com/images/copycode.gif
  ************************************************************************************************************************
  <一>定义三个新的节点标志位p q pr 将链表的前一个节点插下来;

https://img2018.cnblogs.com/blog/1779408/201909/1779408-20190925115141649-1091366556.png
  <二> 然后将节点插到一个新的标志位后边,同样的方法插后边的节点

https://img2018.cnblogs.com/blog/1779408/201909/1779408-20190925115155336-1916614391.png
  <三>插完之后将新的标志位连接到之前的头结点打印

https://img2018.cnblogs.com/blog/1779408/201909/1779408-20190925115209927-1492547374.png
  ***************************************************************************************************************************
  最后在给大家分享些关于链表的资料可以进一步参考
  单链表
   makeru.com.cn/live/5413_1924.html?s=45051
  C语言玩转链表
  makeru.com.cn/live/1392_338.html?s=45051
  指针
  makeru.com.cn/live/1392_238.html?s=45051

页: [1]
查看完整版本: 单链表(linux c)