题目:输入一个链表,从尾到头打印链表每个节点的值。
解题:使用容器的头插入,或者自己再建一个链表,头插入!而且链表在做的时候要咨询是否可以改变其结构!
以及头结点是否有存储有用数据(因为这个因需求设计而异)
总结:关于链表知识,头指针、头结点、第一个节点区别!头指针指向头结点,一般头结点不算第一个节点,
头结点的存在使得链表可以是空表,也使得链表的插入查询等操作保持一致性!这一点非常有用,
当然也有链表的头节点存放有用的数据,这个时候头结点就是第一个节点了!
下面代码,含测试。
struct ListNode {
int val;
struct ListNode *next;
/*ListNode(int x) ://链表初始化
val(x), next(NULL) {}*/
ListNode(int x) //链表初始化
{
val = x;
next = NULL;
}
};
vector<int> printListFromTailToHead(ListNode* head) {
if (head == NULL)
return vector<int>();
ListNode* p = head,new_head(0);
ListNode* p_new = &new_head;//新建一个链表,头指针指向头结点
vector<int> list;
while (p)
{
ListNode* temp = p_new->next;//先保持之前接的
p_new->next = p;
p = p->next;
p_new->next->next = temp;//再接回去
}
p = p_new->next;//头结点不要,里面的东西不属于
while (p)
{
list.push_back(p->val);
p = p->next;
}
return list;
}
int main()
{
ListNode a(1),b(2),c(3);
ListNode* head = &a;
a.next = &b;
b.next = &c;
c.next = NULL;
vector<int> list = printListFromTailToHead(head);
vector<int>::iterator it = list.begin();
for (; it != list.end(); it++)
printf("%d\n",*it);
while (1)
{
}
return 0;
}