反 转 链 表

这是我写的第二遍 刚刚电脑重启了啥都没留下

在链表的学习过程中 我学会了如何去初始化节点 删除节点 以及遇到了链表的第一个大问题

反转链表 众所周知 链表分为 单向链表,双向链表,环形链表。这里反转的链表是 单向链表

反转 顾名思义 将所有的节点指针反转指向上一节点的地址 那么该怎么做呢?

这里我们用到的算法是双指针方法 首先定义一个 Node* pre ,再定义一个Node* temp 最后定义一个Node* current 用于遍历所有的链表元素

由于 pre 指针的初始化应该是处于 current 指针之前的 且头节点反转后的下一项为NULL 所以定义pre 的初始值为 NULL 

现在让我们想像 反转两个节点组成的链表 首先将头节点的指向改为NULL 反转了一个节点 后发现 无法找到第二个节点的地址了 若摆在很长的一条链表中 仅仅是丧失了第二个节点的值便失去了所除去头节点以外的所有节点 这一问题该如何解决呢? 我们会定义一个Node* temp去指向 current的下一节点 即 current.Next 这一问题便愉快地解决了

接下来是遍历的条件 条件有很多 比如 while( current != NULL ) while( current )

显而易见 while( current )比较简洁 因此采用

核心代码如下:


Node* reverse(Node* List) {
	Node* temp;
	Node* pre = NULL;
	Node* current = List;
	while (current) {
		temp = current->Next;
		current->Next = pre;
		pre = current;
		current = temp;
	}
	return pre;	
}

 这里的反转链表使用的是 没有空的头节点的链表 因此可以将 current 直接赋值 List 

1) temp =current -> Next   将 current -> Next 的值先用 temp 记录下来 避免找不到下一节点的问题

2) current -> Next = pre   将遍历的 链表成员 的下一节点定义为他原本的前节点 实现反转 

3) pre = current 将 pre 指针后移至 current 实质上只是向后移动了一位 

4) current = temp 这里的 temp 已经记录过指向的是上一反转操作时 current 指针指向的下一位 在这里将 temp 的值 赋给 current 实现 current 的后移 原理类似 current = current.Next (仅仅类似

5) return pre 返回 pre 的地址 由于循环条件可以知道current会一直遍历到最初链表的尾节点后一位截止 此时 pre 节点所指向的值便是 最初链表 的尾节点 因此返回 pre 的值就可以得到整个反转链表

全部代码如下:

#include<iostream>
using namespace std;
struct Node {
	int value;
	Node* Next;
};
struct Node* List_creat(int a[], int n) {
	Node* List = (Node*)malloc(sizeof(Node));
	if (List == NULL) {
		cout << "创建失败!";
		return NULL;
	}
	Node* p = List;
	p->value = a[0];
	for (int i = 1; i <= n - 1; i++) {
		Node* temp = (Node*)malloc(sizeof(Node));
		temp->value = a[i];
		p->Next = temp;
		p = p->Next;
	}
	p->Next = NULL;
	return List;
}
void display(Node* List) {
	for (Node* p = List; p; p = p->Next)
		cout << p->value << " ";
	cout << endl;
}

Node* reverse(Node* List) {
	Node* temp;
	Node* pre = NULL;
	Node* current = List;
	while (current) {
		temp = current->Next;
		current->Next = pre;
		pre = current;
		current = temp;
	}
	return pre;	
}
int main() {
	int a[5] = { 1,2,3,4,5 };
	Node* List = List_creat(a, 5);
	display(List);
	cout << endl;
	Node* p = reverse(List);
	display(p);
	return 0;
}

饿了 * showmecode

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值