首页 > 其他 > 详细

反转链表

时间:2020-07-24 23:28:23      阅读:85      评论:0      收藏:0      [点我收藏+]

介绍单链表的反转,链表反转有两种实现方式,一种是单纯利用指针改变结点指向来实现,一种是利用头插会反向的性质实现。

首先说明下链表和结点的结构;

typedef struct node{
  int data;
  struct node *next;
}*listNode,*list;

原地指针反向

一般至少两个结点才有必要反转。

进行反转,我们需要两个指针,一个pCur指向当前反转的结点,一个prev指向前一个结点。

技术分享图片

首先让pre的next指向pCur的下一个结点;再让pCur的next指向头节点的下一个结点;这时已经反转了结点,此时链表第一个结点变成了反转的结点,让头节点的next指向pCur;最后移动pCur到下一个要反转的结点。重复上述步骤,直到pCur为NULL。

void reverse_list(list L){
  if(L->next==NULL){               /*empty list*/
    printf("the list is empty.\n");
    return;
  }else if(L->next->next==NULL){   /*only one node*/
    return;
  }
  listNode* prev=L->next;
  listNode* pCur=prev->next;
  while(pCur!=NULL){
    prev->next = pCur->next;
    pCur->next = L->next;
    L->next = pCur;
    pCur = prev->next;
  }
  return;
}

利用头插法反向

头插法会让新插入的结点在链的最前端,可以参考之前的线性数据结构,里面有头插法的实现。

技术分享图片

pCur指向当前需要反转的结点,pNex指向下一个结点。遍历链表,依次把pCur插入链表L中。即实现反转。

void reverse_list(list L){
  if(L->next==NULL){               /*empty list*/
    printf("the list is empty.\n");
    return;
  }else if(L->next->next==NULL){   /*only one node*/
    return;
  }
  listNode* pCur=L->next->next;
  listNode* pNex=pCur->next;
  while(pCur!=NULL){
    pNex=Pcur->next;
    pCur->next=L->next;
    L->next=pCur;
    pCur=pNex;
  }
  return;
}

 

网上最常见的反转用了三个指针,实际你会发现,只需要两个指针就够了。链表反转是很简单的问题,但是可以有多种方法,通过小小的程序熟悉链表的操作,也是很有意思的。

 

反转链表

原文:https://www.cnblogs.com/cpcpp/p/13374900.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!