• 带头结点的单链表反转


    struct Node {
        int data;
        Node *next;
    };

    方法一:就地逆序

    主要思路:在遍历链表的时候,修改当前结点的指针域的指向,让其指向前驱结点。
    为此,需要用三个指针变量分别指向当前结点、前驱结点、后继结点。遍历完所有的结点后,即可以完成指针的逆序。最后,让头节点的指针域指向原来最后一个元素结点。
    void reverse(Node* head) {
    if (head == NULL||head->next == NULL) return;
    Node
    * pre = NULL; Node* cur = head->next; Node* next;
    while (cur) { next = cur->next; cur->next = pre; pre = cur; cur = next; } head->next = pre; }

    方法二:插入法

    主要思路:从链表的第二个结点开始,把遍历到的结点插入到头结点的后面,直到遍历结束。
    void reverse(Node* head) {
    
        if (head == NULL||head->next == NULL) return;
    
        Node *cur, *next;
        cur = head->next->next;//cur初始指向第二个结点(不包括头结点)
        head->next->next = NULL;
    
    
        while (cur) {
            next = cur->next;
            cur->next = head->next;
            head->next = cur;
            cur = next;
        }    
    }

    方法三:原地递归反转

    主要思路:我们使用递归的原理是每次调用函数让他的头指针向后走,直到走到尾节点,我们将尾节点作为头,然后递归回去相当于我们倒着访问了这个单链表
    Node* reverse(Node* head){
        //返回反转链表的首元结点的地址
        if (head == NULL || head->next == NULL)
            return head;
    Node
    * newhead = reverse(head->next); // 先反转后面的链表 head->next->next = head;//再将当前节点(head)设置为其然来后面节点(head->next)的后续节点 head->next = NULL; return newhead; // 此处返回的newhead,永远指向反转后链表的首元节点,不随着回朔而变化。 }
  • 相关阅读:
    Android之TabHost使用(引用SDK例子文档)
    Android之在线词典
    校验插入指定结点是否导致编码循环的示例函数
    查表法按日期生成流水号的示例.sql
    备份数据库并提供下载的asp文件
    Metro风格XAML应用程序性能技巧
    导入文本文件时如何指定字段类型.sql
    宝塔形数据的处理.sql
    将某个目录上的Excel表,导入到数据库中.sql
    Using SqlDataReader’s new async methods in .Net 4.5 Beta
  • 原文地址:https://www.cnblogs.com/fuqia/p/10260342.html
Copyright © 2020-2023  润新知