单链表逆转

本文详细介绍了如何使用三个关键指针逆转单链表,包括处理头结点为空、链表断开以及循环遍历链表的过程。通过具体代码实现,确保读者能够理解和掌握单链表逆转的核心算法。

给定一个单链表,编程实现其逆转。单链表的逆转过程的关键是3个指针:一个记录当前逆转节点的前一个节点,一个记录当前逆转节点的下一个节点,另外一个则记录当前的逆转节点。为什么要3个指针呢?其原因就在于当修改了当前逆转节点的next域后(逆转),链表就暂时断了(即无法再定位下一个节点),因此需要一个指针记录其下一个节点位置(要能够依次遍历)。记录前一个节点位置则很明显:因为要将当前逆转节点的next域指向其上一个节点(这样才叫逆转)。

//逆转单链表    
struct node *reverse_LList(node *head)   
{   
//以p作为当前结点处理,头结点为逆转前的头结点           
     struct node *p,*q,*temp;   
    if(head == NULL)   
       cout << "空表" << endl;//头结点为0,空表     
     q = head;            //q指向头结点     
     p = head->next;      //p指向头结点后一个结点     
     head = p;            //头结点进一位     
     temp = p->next;      //保存当前结点指针域     
     q->next = NULL;     //逆转头结点为尾结点的情况,头指针为空     
     p->next = q;         //后一个结点指向头结点     
            
     while(temp->next != NULL) //判断当前结点的后一结点指针域是否为空,即判断是否为尾结点     
     {   
         q = head;       //q指向头结点       
          p = temp;       //p指向头结点后一个结点     
          temp = p->next; //保存当前结点指针域    
          head = p;       //头结点进一位       
          p->next = q;    //后一个结点指向头结点                                      
     }   
     //此时temp表示以前的尾结点,p表示temp结点的前一结点     
     head = temp;    //逆转尾结点为头结点     
     head->next = p; //头结点指针域指向p     
     return head;        
                   
}   


 

Node* LinkListReserve(LinkNode head)  
  
{  
  
       LinkNode p = NULL; //记录逆转节点的前一个节点;   
  
        LinkNode r = head; //记录当前节点;   
  
       LinkNode q = NULL; //记录逆转节点的下一个节点;   
  
   
       while (r != NULL)  
  
       {  
  
            q = r->_next;  //保存下一个节点   
  
              r->_next = p;  //逆转   
  
              p = r;         //下一次遍历   
  
              r = q;  
  
       }  
 return p;  
  
}  


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值