链表反转--理解链表指针的基本操作

链表反转的方法–主要是理解链表指针

  1. 根据值创建新列表
    Pasted image 20240604210101

  2. 用一个链表指针代替整个新链表
    Pasted image 20240604210932

  3. 两个链表的赋值
    Pasted image 20240604212308
    Pasted image 20240604212325
    Pasted image 20240604212455

  4. 递归求解反向链表
    Pasted image 20240604213709

  5. 用一个链表代替前后链表数据的跳动
    Pasted image 20240604213828
    Pasted image 20240604214345

链表心得

mad等号前面是指针指向,等号后面是节点
注意注意注意注意注意注意

mad等号前面是指针指向,等号后面是节点

其实对象作为虚拟头节点好理解一些

类指针如果没有初始化是不能够调用其中的属性

这种时候最好改的方式是变成类

Pasted image 20240604130251
这个就是错误的,改为类即可
Pasted image 20240604130519

Pasted image 20240604130527

类节点是对象和指针区别:

对象的话可以看着是一个存在的虚空节点

指针的话它其实就是头节点本身,不存在虚空节点这种说法

两者的区别可看,数据结构下面的链表和反转链表

//链表
#include <iostream>
#include<iterator>
using namespace std;

class Node
{
public:
	Node();
	~Node();
	Node(int data, Node* next);
	int data;
	Node* next;

private:
};

Node::Node(int data, Node* next)
	:data(data), next(next)
{
}

Node::Node()
{
}

Node::~Node()
{
}
class Singlelist
{
public:
	Singlelist();
	~Singlelist();
	void print();
	void add(int data);
	void iter_print();
	//尾插
	void add_tail(int data);
	Node* index_find(int index)
	{
		int i = 0;
		Node* p = &node_head;
		for (; p != NULL;)
		{
			p = p->next;

			if (i == index)
			{
				return p;
			}
			++i;
		}
		cout << "index out of range" << endl;
		return NULL;
	}
	void inde_add(int index, int data)
	{
		if (index == 0)
		{
			add(data);
			return;
		}
		Node* p = index_find(index - 1);
		if (p == NULL)
		{
			cout << "index out of range" << endl;
			return;
		}
		p->next = new Node(data, p->next);
	}
	void index_remove(int index)
	{
		if (node_head.next == NULL)
		{
			return;
		}
		if (index == 0)
		{
			node_head.next = node_head.next->next;;
			return;
		}
		Node* p = index_find(index - 1);
		if (p->next == NULL)
		{
			cout << "index out of range" << endl;
			return;
		}
		p->next = p->next->next;
	}
	void merge(Singlelist& list2)
	{
		Node* p1 = &(this->node_head);
		while (p1->next != NULL)
		{
			p1 = p1->next;
		}
		p1->next = list2.node_head.next;
		list2.node_head.next = NULL;
	}
	Node node_head;

private:
};

Singlelist::Singlelist()
{
	this->node_head.next = new Node(6666, NULL);
}

Singlelist::~Singlelist()
{
	//删除节点
	while (node_head.next != NULL)
	{
		Node* temp = node_head.next;
		node_head.next = node_head.next->next;
		delete temp;
		temp = NULL;
	}
}

void Singlelist::print()
{
	Node p = node_head;
	while (p.next != NULL)
	{
		cout << p.next->data << " " << endl;
		p.next = p.next->next;
	}
}
//头插
void Singlelist::add(int data)
{
	node_head.next = new Node(data, node_head.next);
}

void Singlelist::iter_print()
{
	for (Node* p = &node_head; p->next != NULL;)
	{
		cout << p->next->data << " ";
		p = p->next;
	}
}

void Singlelist::add_tail(int data)
{
	Node* p = &node_head;
	while (p->next != NULL)
	{
		p = p->next;
	}
	p->next = new Node(data, NULL);
}

int main2()
{
	Singlelist list;
	Singlelist list2;
	list2.add_tail(1);
	list2.add_tail(2);
	list2.add_tail(3);
	list2.add_tail(4);
	list2.iter_print();

	/*list.add(1);
	list.add(2);
	list.add(3);
	list.add(4);
	list.add(5);

	list.print();*/
	/*list.add_tail(6);
	list.iter_print();*/
	/*list.index_find(2);*/

	list.add(3);
	list.add(4);
	list.add(5);

	list.inde_add(1, 10);
	cout << endl;
	list.iter_print();
	cout << endl;
	list.index_remove(3);
	list.iter_print();
	cout << endl;
	list.merge(list2);
	list.iter_print();
	return 0;
}
//反转链表
#include<iostream>
using namespace std;
class Node
{
public:
	Node();
	~Node();
	Node(int data, Node* next = NULL) :data(data), next(next) {}

	int data;
	Node* next;
private:
};

Node::Node()
{
}

Node::~Node()
{
}
class List
{
public:
	List() :head(NULL) {}
	void print(List& list)
	{
		Node* temp = list.head;
		while (temp != NULL)
		{
			cout << temp->data << " ";
			temp = temp->next;
		}
		delete temp;
	}
	void reverse_create_list(List& list)
	{
		Node* new_head = NULL;
		while (list.head != NULL)
		{
			Node* temp = new Node(list.head->data, new_head);
			new_head = temp;
			list.head = list.head->next;
		}
		list.head = new_head;
	}
	void reverse_pop_list(List& list, List& new_list)
	{
		while (list.head != NULL)
		{
			Node* temp = list.pop(list);
			new_list.add(temp);
		}
	}
	Node* reverse_recursion_list(Node* node)
	{
		if (node == NULL || node->next == NULL)
		{
			//这里需要返回的是节点而不是NULL
			return node;
		}

		Node* new_head = reverse_recursion_list(node->next);
		cout << new_head->data << " ";
		node->next->next = node;
		node->next = NULL;
		return new_head;
	}
	void reverse_point_list(List& list)
	{
		Node* new_head = list.head;
		Node* Next = list.head->next;
		while (Next != NULL)
		{
			list.head->next = Next->next;
			//这里需要一直指向链表的头部
			Next->next = new_head;
			new_head = Next;
			Next = list.head->next;
		}
		list.head = new_head;
		delete Next;
	}
	Node* pop(List& list)
	{
		Node* temp = list.head;
		list.head = temp->next;
		return temp;
	}
	void add(Node* node)
	{
		node->next = this->head;
		this->head = node;
	}
	~List();
	Node* head;
private:
};

List::~List()
{
	while (this->head != NULL)
	{
		Node* temp = this->head;
		this->head = this->head->next;

		delete temp;
	}

	cout << "List Destructor called" << endl;
}
int main()
{
	List list;

	for (int i = 1; i <= 5; )
	{
		list.head = new Node(i, list.head);
		++i;
	}
	list.print(list);
	cout << endl;
	/*list.reverse_create_list(list);*/

	/*List new_list;
	list.reverse_pop_list(list, new_list);*/
	/*list.head = list.reverse_recursion_list(list.head);*/
	list.reverse_point_list(list);
	list.print(list);
	return 0;
}
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值