单链表反转--递归非递归

  ListNode* ReverseList(ListNode* pHead) {

        if(pHead==NULL)
            return NULL;
        if(pHead->next==NULL)
            return pHead;

        ListNode* preNode=pHead;
       //ListNode* ReseNode=NULL;
        ListNode* pNode=pHead->next;
        ListNode* NextNode=NULL;

        while(pNode->next!=NULL)
            {
            //ListNode* NextNode=pNode->next;
            //if(NextNode==NULL)
               // ReseNode=pNode;
            NextNode=pNode->next;
            pNode->next=preNode;
            preNode=pNode;
            pNode=NextNode;
        }
        //NextNode->next=pNode;
        pHead->next = NULL;
        pNode->next=preNode;
        return pNode;

    }
void ReverseList(List* list)
{
    Node* p_pre = NULL;
    Node* p_cur = NULL;
    Node* p_nxt = NULL;
    if(NULL == list)
        return;
    p_cur = (*list)->next;
    p_pre = *list;
    p_pre->next = NULL;
    while(p_cur) {
        p_nxt = p_cur->next;
        p_cur->next = p_pre;
        p_pre = p_cur;
        p_cur = p_nxt;
    }
    *list = p_pre;
}  
Node* Reverse2Point(List* head)
{
    Node* p_cur = NULL;
    Node* p_nxt = NULL;
    if(NULL == *head)
        return;
    p_cur = (*head)->next;
    (*head)->next = NULL;
    while(p_cur) {
        p_nxt = p_cur->next;
        p_cur->next = *head;
        *head = p_cur;
        p_cur = p_nxt;
    }
} 
Node* Reverse(Node* p_cur, Node* p_pre)
{
    if(NULL == p_cur->next) {
        p_cur->next = p_pre;
        return p_cur;
    }
    else {
        Node *p_nxt = p_cur->next;
        p_cur->next = p_pre;
        Reverse(p_nxt, p_cur);
    }
}
时间: 2024-11-16 05:17:51

单链表反转--递归非递归的相关文章

时间复杂度为O(n)的非递归单链表反转【算法导论课后题】

单链表反转:1->2->3->4... 思路:先将1指向3,2指向1,结果为2->1->3->4,然后循环将3插入到2之前 <span style="font-size:18px;">void reverseLinkedList(List head) { List tmp,p; if(head==null) { return ; } tmp=head->next; while(tmp->next !=null){ p=tmp-

单链表的合并(递归、非递归)

递归方法将两个链表合并成一个链表 例:已知两个单链表head1和head2各自有序升序排列,请把他们合并成一个连表并依然有序,并保留原来所有节点 假设以下两个链表: 链表1:1->3->5 链表2:2->4->6 (1)比较1和链表2的第一个节点数据,由于1<2,因此把结果链表头结点指向链表1中的第一个节点,即数据1所在的节点 (2)对剩余的链表1(3->5)和链表2在调用本过程,比较得到结果链表的第二个节点,即2与3比较得到2,此时合并后的链表节点为1->2,这

对于&quot;单链表逆置和递归&quot;的问题的理解.

一. 相关知识要点: 学习或了解基础数据结构和C语言, 对基础链表知识或相关知识有概况性认识. 例如: 本题目结构为: 1 #define elem_type int 2 3 typedef struct _single_list { 4 elem_type data; //所存的数据元素 5 _single_list *next; //所存的指针元素 6 }ListNode; 二. 问题的思考过程(本题以3种不同的方法解决): <1>类似于我们学习的C语言基础知识中的冒泡排序(参考C程序设计

图解单链表反转

仅一家之言,望多交流,如有错漏,还请指教! 另,做图不易,转发请注明出处 https://www.cnblogs.com/luego/p/11421590.html 本文有要以图的方式,来呈现链表反转推演的具体过程,以助于理解,保持思路的清晰. 主要采用两种方法实现单链表反转: (1)通过循环,通过三个指针对链表进行遍历,并逐个反转: (2)使用递归的方法进行反转.  1. 循环反转 废话不多说,先上图: 操作过程: ① 初始化pNext至当前节点的下一个节点,为断链做准备② 判断下一个节点是否

单链表反转的2种方法

1 public class ReverseDemo { 2 3 /** 4 * 单链表反转的两种方法 5 */ 6 public static void main(String[] args) { 7 Node head =new Node("a"); 8 Node node2=new Node("b"); 9 Node node3=new Node("c"); 10 head.setNext(node2); 11 node2.setNext(

单链表反转C语言实现

单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: # include <iostream> # include <cstdlib> using namespace std; struct linkNode { int val; linkNode *next; linkNode(int x):val(x),next(NULL){} }; linkNod

单链表反转python实现

单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: class ListNode: def __init__(self,x): self.val=x; self.next=None; def nonrecurse(head): #循环的方法反转链表 if head is None or head.next is None: return head; pre=None; c

单链表反转java代码

据说单链表反转问题面试中经常问,而链表这个东西相对于数组的确稍微难想象,因此今天纪录一下单链表反转的代码. 1,先定义一个节点类. 1 public class Node { 2 int index; 3 Node next; 4 5 public Node(int index, Node next) { 6 this.index = index; 7 this.next = next; 8 } 9 } 2,我一共写了三种方法 (1)迭代法.先将下一节点纪录下来,然后让当前节点指向上一节点,再将

单链表反转问题

单链表反转问题 基本问题 如何将单链表反转? 算法实现 /** * * Description: 单链表反转. * * @param head * @return ListNode */ public static ListNode reverseList(ListNode head) { if (head == null) { return head; } ListNode prev = null; ListNode current = head; ListNode next = null;

快速排序递归非递归队列堆栈实现

递归实现 #include<iostream> using namespace std; template <class T> void QuickSort(T A[],int left,int right) { if(left<right) { int i=left; int j=right+1; do { do i++;while(A[i]<A[left]); do j--;while(A[j]>A[left]); if(i<j) Swap(A[i],A