Reverse LinkList

问题

翻转单链表
举例:
原始链表: 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)