剑指offer-15:反转链表
目录
1题目描述
输入一个链表,反转链表后,输出链表的所有元素。
2题目解析
每次循环的情况写出来,假设初始链表是 0 -> 1 -> 2 -> 3 -> 4
// 0 -> 1 -> 2 -> 3 -> 4 oldHead指向0, newHead指向0,toBeReversed指向1
// 1 -> 0 -> 2 -> 3 -> 4 oldHead指向0, newHead指向1,toBeReversed指向2
// 2 -> 1 -> 0 -> 3 -> 4 oldHead指向0, newHead指向2,toBeReversed指向3
// 3 -> 2 -> 1 -> 0 -> 4 oldHead指向0, newHead指向3,toBeReversed指向4
// 4 -> 3 -> 2 -> 1 -> 0 oldHead指向0, newHead指向4,toBeReversed指向null
3题目答案
从原链表的头部一个一个取节点并插入到新链表的头部
原01234,
取1放在头部,10234
取2放在头部,21034
取3放在头部,32104
取4放在头部,43210
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if (pHead == NULL) return NULL; //代码的鲁棒性
ListNode* head = pHead;
pHead = pHead->next;
head->next = NULL;
//假设原链表为: 0->1->2->3->4,pHead指向0
//上面三行之后:0->NULL 1->2->3->4, head指向0,pHead指向1
//pHead不断向右取,直到pHead=NULL,终止循环
while (pHead) {
ListNode* next = pHead->next;
//第一次进入循环时,0->NULL 1->2->3->4,head指向0,phead指向1,next指向2
pHead->next = head;//(1的next为0,即)
head = pHead; //head指向了1
pHead = next; //pHead指向了2
//第一次进入循环时, 1->0->2->3->4
//其中head始终指向新链表的头部,pHead始终指向(要拿出来放在新链表头部)的位置
}
return head;
}
};