时间限制:1秒 空间限制:32768K 热度指数:292046
本题知识点: 链表
算法知识视频讲解
题目描述
输入一个链表,反转链表后,输出新链表的表头。
类似前面一道链表翻转的题剑指offer(3),这个题更加简单,无需考虑存储遍历的链表结点元素。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode *pNode=pHead;//当前结点
ListNode *pPrev=NULL;//当前结点的前一个结点
while(pNode!=NULL){
ListNode *pNext=pNode->next;
pNode->next=pPrev;//当前结点指向前一个结点
pPrev=pNode;//pPrev和pNode往前移动。
pNode=pNext;//这里要使用前面保存下来的pNext,不能使用pNode->next
}
return pPrev;//返回反转链表头指针。
}
};
或者(其实道理一样):
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
ListNode *buf = pHead;
ListNode *pre = buf;
if(pHead == NULL)
return NULL;
while(pHead->next != NULL){
buf = pHead->next;
pHead->next = buf->next;
buf->next = pre;
pre = buf;
}
return buf;//返回反转链表头指针。
}
};