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

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

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

结构体定义: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. }  

 

posted @ 2019-03-25 20:21  cxxxxx  阅读(681)  评论(0编辑  收藏  举报