码迷,mamicode.com
首页 > 其他好文 > 详细

线性表总结(单链表的反转)

时间:2019-03-25 20:34:18      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:单链表   public   链接   头部   head   使用   star   自己   .com   

主要总结单链表反转的几种方法

第一种方法貌似是递归,不太懂,第二种方法使用三个指针逐一完成逆置

结构体定义:class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { //这步没看懂,是结构体里引用了自己吗
        val = x;
        next = null;
    }
}
技术图片
 1     // 1.就地反转法
 2     public ListNode reverseList1(ListNode head) {
 3         if (head == null)
 4             return head;//判断传入的指针是否为空,为空则返回。
 5         ListNode dummy = new ListNode(-1);//申请内存
 6         dummy.next = head;
 7         ListNode prev = dummy.next;
 8         ListNode pCur = prev.next;//如图所示
 9         while (pCur != null) {
10             prev.next = pCur.next;//prev指针指向3   prev指向4  
11             pCur.next = dummy.next;//pcur指针指向1 pcur指向2 
12             dummy.next = pCur;//dummy指针指向2  dummy指向3
13             pCur = prev.next;//pcur指向3 pcur指向4
14         }//一步一步看得懂,但是不明白总体的动态过程是怎样的,一个个往后指怎么完成逆置
15         return dummy.next;
16     }

总结:

  • 不明白结构体里的引用是什么意思
  • 不明白整个函数是如何动态完成逆置的

 

 


 

使用3个指针遍历单链表,逐个链接点进行反转。

 

  1. ActList* ReverseList2(ActList* head)  
  2. {  
  3.     //ActList* temp=new ActList;  
  4.  if(NULL==head|| NULL==head->next) return head;     //少于两个结点则不反转
  5.     ActList* p;  
  6.     ActList* q;  
  7.     ActList* r;  
  8.     p = head;    
  9.     q = head->next;  
  10.     head->next = NULL;//使头结点指向空 
  11.     while(q){  
  12.         r = q->next; //记录第三个结点
  13.         q->next = p; //将第二个结点指向第一个,完成逆置
  14.         p = q;   
  15.         q = r;   //三个结点同时后移
  16.     }  
  17.     head=p;//使头结点重新指向头部
  18.     return head;      
  19. }  

 

线性表总结(单链表的反转)

标签:单链表   public   链接   头部   head   使用   star   自己   .com   

原文地址:https://www.cnblogs.com/cxxxxxx/p/10596363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!