问题
翻转单链表
举例:
原始链表: 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*。
如果是想改变指针指向的位置,要传双指针。