单链表反转(非递归)

单链表的反转有很多种方法,这里最主要讲一下非递归方法中的移动指针的方法。

对于这种方法可能在移动指针的时候很容易出错,所以我想了一种的特殊的思考方法。

在创建链表的时候,有头插法和尾插法两种方法,而头插法创建的链表其数据的顺序刚好与输入的顺序相反,因此可以利用这个特点反转单链表。我们可以从新“创建”单链表,数据来源于原链表。

代码(C++):

#include<iostream>
using namespace std;

struct Node
{
	int data;
	Node* next;
};

bool init(Node**h)
{
	*h=new Node();
	if(!(*h))
		return true;
	return false;
}
//采用头插法从新“创建”链表
//节点采用链表head中的节点
void reverseList(Node*head)
{
	Node *h,*temp;
	h=head->next;
	head->next=NULL;
	while(h)
	{
		temp=h;//取下一个节点
		h=h->next;

		temp->next=head->next;//头插法
		head->next=temp;
	}
}

int main()
{
	Node *head,*p;
	init(&head);
	cout<<"原列链表: ";
	p=head;
	for (int i=0;i<10;i++)
	{
		p->next=new Node();
		p=p->next;
		p->data=rand()%100;
		p->next=NULL;
		cout<<p->data<<"  ";
	}
	cout<<endl;
	cout<<"反转后的链表: ";
	reverseList(head);
	p=head->next;
	while(p)
	{
		cout<<p->data<<"  ";
		p=p->next;
	}
	cout<<endl;
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值