反转链表17

来源:互联网 发布:微商城开发费用 知乎 编辑:程序博客网 时间:2024/06/03 10:58

题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。链表节点的定义如下:

struct ListNode{  int m_value;  //节点存储的值  ListNode *m_next;  //节点指针  void show(); //打印所有节点值};

解题思路:需要三个指针,当前遍历的节点,它的前一个节点以及它的后一个节点,防止链表断开。

测试用例:

int main(){    //创建一个多结点链表    ListNode *L2 = new ListNode;    L2 = NULL;      addToTail(&L2, 1);     addToTail(&L2, 2); //末尾加入2    addToTail(&L2, 3); //末尾加入3    addToTail(&L2, 4); //末尾加入4    addToTail(&L2, 5); //末尾加入5    addToTail(&L2, 6); //末尾加入6    //显示L2    std::cout << "L2: ";       L2->show(); //Output:1,2,3,4,5,6    std::cout << std::endl;     //反转链表,多个节点    std::cout << ReverseList(L2)->m_value << std::endl;  //OutPut: 6    //单个节点    ListNode *L1 = new ListNode;    L1 = NULL;    addToTail(&L1, 9);    std::cout << ReverseList(L1)->m_value;    return 0;}

反转链表函数实现:

//本题函数实现ListNode* ReverseList(ListNode *pHead){    if(!pHead){        std::cout << "List is NULL\n";        return NULL;    }    //待返回的头节点    ListNode *reversedHead = new ListNode;    reversedHead = NULL;    //当前遍历到的节点    ListNode *pNode = pHead;    //当前遍历节点的前一节点    ListNode *pPrev = new ListNode;    pPrev = NULL;    while(pNode != NULL){        //当前遍历节点的后一个节点        ListNode* pNext = pNode->m_next;        if(pNext == NULL)            reversedHead = pNode;        //当前结点的下一节点指向当前结点的前一节点        pNode->m_next = pPrev; //这是反转的过程        //前一节点指向遍历的当前结点        pPrev = pNode;        //当前遍历的节点指向下一节点        pNode = pNext;    }    return reversedHead;}//以下为其他函数实现void ListNode::show(){    ListNode *temp = this;    if(temp == NULL)        std::cout << "\nlist is NULL\n";    while(temp != NULL){       std::cout << temp->m_value << " ";       temp = temp->m_next;    }}//在一个链表的末尾添加一个节点void addToTail(ListNode **head, int value){//由于会改动链表指针,所以必须把head参数设为指向指针的指针。否则出了这个函数作用域,改动便无效。    //1.首先创建要插入的节点    ListNode *pNew = new ListNode;    pNew->m_value = value; //指定值    pNew->m_next = NULL; //!!!切记指定下一节点为NULL    //2.如果传入的节点为空,可直接创键头节点    if(*head == NULL)        *head = pNew;    else{//否则3.        //定义一个临时节点        ListNode *temp = *head;        while(temp->m_next != NULL) //循环指向末尾节点, !!!切记必须指向下一节点            temp = temp->m_next;        //对末尾的下一个节点赋值,取代之(末尾)        temp->m_next = pNew;    }}
0 0
原创粉丝点击