常见算法:反转单链表

单链表反转的思路

使用3个指针,分别指示当前节点,当前节点的前一个节点,以及后一个节点。初始化前一个节点为空。当节点个数大于1时,每遍历一个节点,更新它的next指针指向前一个节点。同时更新前一个节点和后一个节点。直至当前节点指针为空,返回前一个节点的指针。

代码

#include <iostream>

using namespace std;

struct Node {
	int value;
	Node *next;
	Node() {
	}

	Node(int i):value(i),next(NULL){
	}
};

void addNode(Node **list, int i) {
	if (!list ||!*list) {
		return;
	}
	Node *n = *list;
	Node *cur = n;
	Node *tailP = NULL;
	
	while(cur) {
		tailP = cur;
		cur = cur->next;
	}

	Node *node = new Node(i);
	tailP->next = node;
}

void printNode(Node *list) {
	if (list) {
		Node *c = list;
		while(c) {
			cout<<c->value;
			c = c->next;
			if (c) {
				cout<<"; ";
			}
		}

		cout<<endl;
	}
}

Node *reverseList(Node *list) {
	if (list && list->next) {
		Node *prev = NULL;
		Node *cur = list;

		while(cur) {
			Node *follow = cur->next;
			cur->next = prev;
			
			prev = cur;
			cur = follow;
		}

		return prev;
	}

	return list;
}

int main() {
	Node *head = new Node(1);
	const int maxInt = 10;
	for (int idx = 2;idx < maxInt;idx++) {
		addNode(&head,idx);
	}
	cout<<"befor reverse:"<<endl;
	printNode(head);

	Node *reverseHead = reverseList(head);
	cout<<"after reverse:"<<endl;
	printNode(reverseHead);
	return 0;
}

易错点

  1. 当前链表长度大于1时,才需要反转。
  2. 反转后的链表指针为指向前一个节点的指针。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值