zoukankan      html  css  js  c++  java
  • 线性表总结(单链表的反转)

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

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

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

     

  • 相关阅读:
    判断二叉树是否是完全二叉树
    二叉搜索树的第k个节点
    二叉树的深度
    二叉搜索树与双向链表
    二叉搜索树的后序遍历序列
    poj 2192 (DP)
    poj 1159 (DP LCS)
    poj 1934(LCS)
    《编程之美》读书笔记 -- 1.2中国象棋问题
    poj 1050(DP)
  • 原文地址:https://www.cnblogs.com/cxxxxxx/p/10596363.html
Copyright © 2011-2022 走看看