反转链表输出

题目:输入一个链表,从尾到头打印链表每个节点的值。

解题:使用容器的头插入,或者自己再建一个链表,头插入!而且链表在做的时候要咨询是否可以改变其结构!
以及头结点是否有存储有用数据(因为这个因需求设计而异)


总结:关于链表知识,头指针、头结点、第一个节点区别!头指针指向头结点,一般头结点不算第一个节点,
头结点的存在使得链表可以是空表,也使得链表的插入查询等操作保持一致性!这一点非常有用,

当然也有链表的头节点存放有用的数据,这个时候头结点就是第一个节点了!

下面代码,含测试。

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;
}

### 单链表反转的C++实现 为了实现单链表反转功能,在C++中可以定义一个`ListNode`结构用于表示链表节点,并创建相应的函数来进行链表的操作。 #### 定义链表节点结构 首先,需要定义链表节点的数据结构。这里采用了一个简单的整型数据作为节点存储的信息[^3]: ```cpp typedef struct ListNode { int data; ListNode* next; ListNode(int val) : data(val), next(nullptr) {} }; ``` #### 反转链表的方法 对于链表反转操作,可以通过迭代的方式完成。下面给出了一种常见的方法来实现这一过程[^1]: ```cpp ListNode* reverseList(ListNode* head) { ListNode *prev = nullptr, *curr = head, *nextNode = nullptr; while (curr != nullptr){ nextNode = curr->next; // 记录下一个节点 curr->next = prev; // 当前节点指向前一节点 prev = curr; // 前移一位 curr = nextNode; // 移动到下个节点继续处理 } return prev; // 返回新的头部 } ``` 此段代码通过三个指针变量(`prev`, `curr`, 和 `nextNode`)逐步遍历整个列表并将每个节点的方向改变指向其前置节点直到到达原始链表末端从而完成了链表的整体反转。 #### 测试与验证 为了测试上述编写的反转算法是否正常工作,可以在主程序中构建一个简单例子并调用该函数以及打印结果以确认正确性[^2]: ```cpp int main(){ // 创建几个节点实例形成初始未反转状态下的链表... ListNode n1(1); ListNode n2(2); ListNode n3(3); n1.next = &n2; n2.next = &n3; // 执行反转逻辑 ListNode* reversedHead = reverseList(&n1); // 输出反转后的链表查看效果 printList(reversedHead); return 0; } void printList(ListNode* head){ ListNode* curr = head; while(curr != nullptr){ cout << curr->data << " "; curr = curr->next; } cout << endl; } ``` 以上就是利用C++语言实现单向链表反转的一个基本方案说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值