完全无基础小白也能看懂的题解 | #反转链表#
反转链表
http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca
代码分为两部分,头部定义和代码反转部分。
1.结构体 ListNode里面两个成员变量int val,struct ListNodenext.
*代表是个指针变量,前面要加struct因为这是结构体,并且ListNode没有被typedef
内涵一个成员函数,可以创建一个指向空,值为x的结点指针,不是结点而是指针。
关于NULL和nullptr:为解决NULL代指空指针存在的二义性问题,在C++11版本(2011年发布)中特意引入了nullptr这一新的关键字来代指空指针,从上面的例子中我们可以看到,使用nullptr作为实参,确实选择了正确的以void作为形参的函数版本。
2.反转类一般创建三个辅助结点,前一个,当前,下一个。
/*
struct ListNode {
int val;
struct ListNode next;
ListNode(int x) :
val(x), next(NULL) {
}
};/
class Solution { public: ListNode* ReverseList(ListNode* pHead) { ListNode* pReversedHead=nullptr;//这个其实可以不用 ListNode* pNode=pHead; ListNode* pPrev=nullptr; while(pNode!=nullptr)//这里改为pNext!=nullptr,这边用NULL和题契合一点。 { ListNode* pNext=pNode->next; if(pNext==nullptr) pReversedHead=pNode; pNode->next=pPrev; pPre***ode; pNode=pNext; } return pReversedHead;//这边直接返回pNext } };