记录地址,逆序链接
struct ListNode* ReverseList(struct ListNode* pHead) {
if (pHead == NULL) {
return pHead;
}
struct ListNode *pTemp = pHead->next;
// 统计节点个数
int count = 1;
while (pTemp) {
count++;
pTemp = pTemp->next;
}
// 创建指针数组
struct ListNode * addrs[count];
pTemp = pHead;
for (int i = 0; i < count; i++) {
addrs[i] = pTemp;
pTemp = pTemp->next;
}
// 逆序链接
for (int i = count-1; i > 0; i--) {
addrs[i]->next = addrs[i-1];
}
addrs[0]->next = NULL;
return addrs[count-1];
}
迭代
struct ListNode* ReverseList(struct ListNode* pHead) {
struct ListNode* pPrev = NULL; // 初始化为 NULL
struct ListNode* pCurr = pHead; // 从 pHead 开始
struct ListNode* pNext;
while (pCurr) {
pNext = pCurr->next; // 在反转前先记录后一节点
pCurr->next = pPrev; // 核心操作:指向前一节点
pPrev = pCurr; // 准备下一轮
pCurr = pNext; // 准备下一轮
}
return pPrev; // pCurr 为 NULL 时,pPrev 即为反转过后的头节点
}
递归(一)
struct ListNode* ReverseListCore(struct ListNode* pCurr, struct ListNode* pPrev) {
if (pCurr == NULL)
return pPrev;
struct ListNode* pNext = pCurr->next; // 记录下一节点
pCurr->next = pPrev; // 反转
return ReverseListCore(pNext, pCurr); // 对下一节点进行反转
}
struct ListNode* ReverseList(struct ListNode* pHead) {
return ReverseListCore(pHead, NULL);
}
递归(二)
struct ListNode* ReverseList(struct ListNode* pHead) {
if (pHead == NULL || pHead->next == NULL) {
return pHead;
}
struct ListNode* newHead = ReverseList(pHead->next);
pHead->next->next = pHead;
pHead->next = NULL;
return newHead;
}