单链表逆转问题

  • 实现对含有n个元素的单链表的逆转,要求运行时间O(n),除了链表本身所需空间外,只使用固定大小的存储空间。(此题来自《算法导论》10.2-7)

    从头元素开始循环,将原本指向其后继节点的指针指向其前驱节点,直到循环至哨兵为止。整个过程额外需要三个指针变量的空间,分别保存当前节点及其前驱、后继。

    下面是一个简单的C++实现。

struct Node
{
    Node* pNext;
    int key;
};

class SingleLinkedList
{
public:
    SingleLinkedList();
    ~SingleLinkedList();
    void Insert(int key);
    void Traverse() const;
    void Invert();
private:
    Node m_sentinel;
};

SingleLinkedList::SingleLinkedList()
{
    m_sentinel.pNext = &m_sentinel;
}

SingleLinkedList::~SingleLinkedList()
{
    Node* pCurrent = m_sentinel.pNext;
    Node* pNext = nullptr;
    while(pCurrent != &m_sentinel)
    {
        pNext = pCurrent->pNext;
        delete pCurrent;
        pCurrent = pNext;
    }
}

void SingleLinkedList::Insert(int key)
{
    Node* pNew = new Node;
    pNew->pNext = m_sentinel.pNext;
    pNew->key = key;
    m_sentinel.pNext = pNew;
}

void SingleLinkedList::Traverse() const
{
    Node* pCurrent = m_sentinel.pNext;
    while(pCurrent != &m_sentinel)
    {
        cout << pCurrent->key << ‘\t‘;
        pCurrent = pCurrent->pNext;
    }
}

void SingleLinkedList::Invert()
{
    Node* pPrevious = &m_sentinel;
    Node* pCurrent = m_sentinel.pNext;
    Node* pNext = nullptr;
    while(pCurrent != &m_sentinel)    //每一步循环修改当前节点的pNext属性,并将pPrevious pCurrent pNext 都向后移一位
    {
        pNext = pCurrent->pNext;
        pCurrent->pNext = pPrevious;
        pPrevious = pCurrent;
        pCurrent = pNext;
    }
    pCurrent->pNext = pPrevious;
}

int main()    //测试代码
{
    SingleLinkedList* p = new SingleLinkedList;
    for(int i = 0; i != 10; ++i)
        p->Insert(i);
    p->Traverse(); cout << endl; //9,8,7...0
    p->Invert();
    p->Traverse(); cout << endl; //  0,1,2...9
    delete p; p = nullptr;
    return 0;
}

//输出结果
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9

原文地址:https://www.cnblogs.com/meixiaogua/p/9695180.html

时间: 2024-10-08 00:01:14

单链表逆转问题的相关文章

6-1 单链表逆转(20 分)

6-1 单链表逆转(20 分) 本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ L是给定单链表,函数Rever

6-1 单链表逆转

本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ L是给定单链表,函数Reverse要返回被逆转后的链表. 裁判

PTA——6-1 单链表逆转 (20分)

题目地址 本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ L是给定单链表,函数Reverse要返回被逆转后的链

6-1 单链表逆转 (20分)

题目链接:6-1 单链表逆转 (20分) 方式一:递归逆置单链表 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <string.h> 5 #include <ctype.h> 6 7 #define maxn 5000 8 #define newline printf("\n") 9 10 11 typedef int Ele

单链表逆转

参照:http://www.cnblogs.com/bluestorm/p/3167424.html #include <stdio.h> #include <stdlib.h> struct list{ char data; struct list *next; }node; struct list* input() { //p作为新结点,q不断连接新结点,h作为首结点返回 struct list *p,*q,*h = NULL; while(1) { //新创建一个结点 p =

【算法设计-单链表的逆转】单链表逆转实现

1.在Θ(n)时间内将链表转置,而且只能需要少量的额外空间 这里需要用3个指针使得q指向p然后依次后移. 代码: #include<iostream> using namespace std; typedef struct Node { int data; struct Node *next; }LinkList; LinkList* Create_End(); void printLinkList(LinkList *L); LinkList* Create_End() { LinkList

[PTA] 数据结构与算法题目集 6-1 单链表逆转

List Reverse(List L) { List p, q; p = L; q = L; L = NULL; while (p) { p = p->Next; q->Next = L; L = q; q = p; } return L; } 原文地址:https://www.cnblogs.com/ruoh3kou/p/9975225.html

pta-数据结构与算法题目集(中文)-4-1-单链表逆转

4-1 单链表逆转   (20分) 本题要求实现一个函数,将给定的单链表逆转. 函数接口定义: List Reverse( List L ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ L是给定单链表,函数Rev

单链表的逆转

算法导论:10.2-7 给出一个 O(n) 时间的非递归过程,实现对一个含有 n 个元素的单链表的逆转.要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间. #ifndef _SINGLY_LINKED_LIST_H #define _SINGLY_LINKED_LIST_H /*********************************************************** 10.2-7 单链表类,并实现了在 O(n) 时间内链表的逆转 ***********