美文网首页
Reverse LinkList

Reverse LinkList

作者: ClaireYuan_e78c | 来源:发表于2019-04-23 17:22 被阅读0次

    问题

    翻转单链表
    举例:
    原始链表: 1->2->3->4
    就地翻转,翻转后: 4->3->2->1

    主要思路

    需要两个指针,一个指向currentNode,一个指向prevNode。每次操作都是将currentNode的next指到前一个节点,操作前注意记录currentNode的next位置。

    初始化:currentNode指向链表首元素,prevNode为空。
    循环体:

    • 用temp保存currentNode的pNext。
    • 主要操作:将currentNode的next指向prevNode。
    • 更新prevNode 和currentNode。

    代码如下:

    void ReverseList(LinkList** pList){
        if (*pList == NULL) {
            return;
        }
    
        Node* pCurrent = *pList;
        Node* pPrev = NULL;
        while(pCurrent){
            Node *pNext = pCurrent->pNext;
            pCurrent->pNext = pPrev;
            pPrev = pCurrent;
            pCurrent = pNext;
        }
        if (pPrev) {
            *pList = pPrev;  
        }
    }
    

    出错的地方

    1、 单链表节点定义
    编译报warning如下:

    algorithm/list.c:19:15: warning: incompatible pointer types initializing 'Node *' with an expression of type 'struct Node *' [-Wincompatible-pointer-types]
    

    错误定义:

    typedef struct{
        int val;
        struct Node *pNext;
    }Node;
    

    正确的定义:

    typedef struct Node{
        int val;
        struct Node *pNext;
    }Node;
    

    2、函数的形参类型定义错误
    错误的定义:

    void ReverseList(LinkList* pList)
    

    正确的定义:

    void ReverseList(LinkList** pList)
    

    如果是想改变指针指向的内容,传单指针ok。在本例中,如果是想改变Node的值,传Node*。
    如果是想改变指针指向的位置,要传双指针。

    相关文章

      网友评论

          本文标题:Reverse LinkList

          本文链接:https://www.haomeiwen.com/subject/qycbgqtx.html