链表、头指针、头结点(经典)
链表参考:链表、头指针、头结点(经典)
头指针、头结点、第一个结点的区别与联系?
(1)头指针明显是一个指针,指向头结点
头节点的next指针指向第一个节点
第一个节点是一个节点,data变量存放第一个数据,next指针变量指向第二个节点
(2)头指针是指向头结点的指针
头结点是出于第一个结点之前的空结点
第一个结点就是出于第一个的结点(除头结点外)
(3)一个链表中,可以没有头结点,但是一定有头指针,头指针是对单链表的标识,
如果没有头结点,则头指针指向第一个结点
(4)设置头结点是为了保证处理第一个节点和后面的节点的时候设计的算法相同,实现程序的高效性。参照:链表设置头指针的作用是什么
- 链表的反转
struct ListNode
{
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) { }
};
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) { //牛客网的题目,传进来的是无头结点的链表,头指针指向第一个数据结点
vector<int> vec;
ListNode *cur,*beh,*pre;
cur=head; //cur是当前操作的结点
pre=NULL; //pre是原链表中当前结点的前结点
while(cur)
{
beh=cur->next; //beh是原链表中当前结点的后结点,先记录下来
cur->next=pre; //cur与beh断开
pre=cur; //cur指向pre
cur=beh; //当前结点后移
}
cur=pre; //cur指向为空时跳出循环,此时让其指向第一个结点
while(cur)
{
vec.push_back(cur->val);
cur=cur->next;
}
return vec;
}
};
2.链表有头结点
链表参考:链表、头指针、头结点(经典)
C++递归算法:我的理解