链表倒序 这个for循环好啊!

  链表倒序,难点在于如何一个个地修改。虽然不是数组,但是大概思想是一样的,所以可以用一个for循序,一个游标对应for循环里面的 i,只不过要记得前一个节点和后一个节点,尤其是后一个,因为修改之后就访问不到后面的,所以要记录。for每一个循环只改变所指向的那个节点的指针,这样既不会乱套了。

  用一个for循环就非常好理解了,之前用while把我自己都搞晕电脑了。。。

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

//链表节点类
class Node
{
private:
    int m_data;
    Node* m_next;

    Node(Node&) {}        //copy constructor is not allowed

public:
    explicit Node(int val = 0) : m_data(val), m_next(NULL) {}
    int getData() const { return m_data; }
    void setData(int val) { m_data = val; }
    Node* getNext(void) const { return m_next; }
    void setNext(Node* p) { m_next = p; }
};

//链表
class MyList
{
private:
    Node* m_head;    //pionter to the first node of the list
    Node* m_tail;    //poinoer to the last node of the list

    MyList(MyList&) {}
public:
    explicit MyList() : m_head(NULL), m_tail(NULL) {}
    void addNode(Node* pNode);
    void show(void) const;
    void reverse(void);
    void clean(void);
};

void MyList::addNode(Node* pNode)
{
    if (m_head)
    {
        m_tail->setNext(pNode);
        m_tail = pNode;
    }
    else        //blank list
    {
        m_head = pNode;
        m_tail = pNode;
    }
}

void MyList::show(void) const
{
    Node* pNode = m_head;
    while (pNode)
    {
        std::cout << pNode->getData() << "    ";
        pNode = pNode->getNext();
    }
}

void MyList::reverse(void)
{
    Node* preNode = NULL;        //下面游标的前一个
    Node* pNode ;        //指向每一个节点,相当于游标
    Node* afterNode;        //上面游标的上一个

    for (pNode = m_head; pNode != NULL; pNode = afterNode)    //这里的每次循环对应一个节点,本质上和数组原理差不多
    {
        afterNode = pNode->getNext();
        pNode->setNext(preNode);
        preNode = pNode;
    }

    pNode = m_head;    //交换头尾指针
    m_head = m_tail;
    m_tail = pNode;
}

void MyList::clean(void)
{
    if (m_head)
    {
        Node* pNode = m_head;
        Node* pTemp;
        while (pNode)
        {
            pTemp = pNode->getNext();
            delete pNode;
            pNode = pTemp;
        }

        m_head = m_tail = NULL;
    }
}

int main(void)
{
    MyList listHead;

    srand((unsigned)time(NULL));
    for (int i = 0; i < 9; i++)
    {
        int temp = rand() % 50;
        Node* pNode = new Node(temp);
        listHead.addNode(pNode);
    }
    listHead.show();

    listHead.reverse();
    cout << endl;
    listHead.show();
    listHead.clean();
    listHead.show();

    system("pause");
}

链表倒序 这个for循环好啊!

时间: 2024-10-01 07:38:16

链表倒序 这个for循环好啊!的相关文章

Linked List Cycle 判断一个链表是否存在回路(循环)

Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using extra space? 注意,链表循环并不是尾指针和头指针相同,可能是在中间某一段形成一个环路,所以不能只判断元素和第一个元素是否存在重合 先设置两个指针p_fast和p_slow.从头开始遍历链表,p_fast每次走两个节点,而p_slow每次走一个节点,若存在循环,这两个指针必定重合: 1 /**

PAT 链表倒序的算法优化

之前的答案错误问题已经解决了,现在还有运行超时的问题,先贴上之前的代码 1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 5 int main() 6 { 7 int count, renum; 8 string add; 9 cin>>add>>count>>renum; 10 string add1[count],add2[count],madd1[cou

单链表倒序

1 mylist *listReverse(mylist *head) 2 { 3 mylist *p=head; 4 mylist *pfront=NULL,*pNext; 5 while(p!=NULL) 6 { 7 pNext=p->next; 8 p->next=pfront; 9 pfront=p; 10 p=pNext; 11 } 12 return pfront; 13 }

Python实现链表倒序(带头指针)

class node: def __init__(self, value): self.value = value self.next = None def reverse(head): if head is None or head.next is None or head.next.next is None: return head if head.next.next.next is None: t = head.next.next t.next = head.next head.next.

【C语言数据结构】循环单链表

CircleLinkList.h #ifndef CIRCLE_LINK_LIST #define CIRCLE_LINK_LIST //链表节点 typedef struct _CircleLinkListNode {     struct _CircleLinkListNode *next; }CircleLinkListNode; //循环单链表 typedef void CircleLinkList; /*  * 创建循环单链表  * @return 返回循环单链表的指针  */ Cir

用两种递归思路与循环实现单链表的反转

typedef struct ListNode{ int data; struct ListNode *next; }ListNode; //递归一 ListNode *ReverseList (ListNode *pHead, ListNode *nHead = NULL) { //每次取下第一个节点头插法创建新链表 //nHead为反转后链表的头节点 if(pHead == NULL) return NULL; ListNode *pNext = pHead -> next; pHead -

leetcode206 反转链表 两种做法(循环,递归)

反转链表 leetcode206 方法1 循环 ··· public ListNode reverseList(ListNode head) { if (head == null || head.next == null) { return head; } ListNode now = head; while (now.next != null) { ListNode temp = now.next; now.next = now.next.next; temp.next = head; hea

查找两个单词链表共同后缀的起始结点

描述 假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀空间.例如,"loading"和"being"的存储映像如下图所示: 设str1和str2分别指向两个单词所在单链表的头结点,请实现一个时间上尽可能高效的算法,找出由str1和str2所指的两个链表共同后缀的起始位置的结点,输出该结点对应的字符(如图中的字符i) 输入 多组数据,每组数据有三行,第一行为链表str1和str2的长度n和m,第二行为链表str1的n个元素,第三行为链表s

数据结构:单向链表(Linked List)

本文来源: Linked List | Set 1 (Introduction) Linked List | Set 2 (Inserting a node) Linked List | Set 3 (Deleting a node) Find Length of a Linked List (Iterative and Recursive) (todo:在结构中保持节点数信息) Search an element in a Linked List (Iterative and Recursiv