手写数据结构:链表

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写数据结构:链表相关的知识,希望对你有一定的参考价值。

刚开始比较懒,写的不多。代码部分测试,等整个系列写完再完整的测一遍


#include<iostream>

using namespace std;

class ListNode {
private:
	int value;	//值域
	struct ListNode* next;	//指针域

public:
	ListNode(int value) {
		this->value = value;
		this->next = NULL;
	}

	void add_node(ListNode* next_node) {
		this->next = next_node;
	}

	void set_value(int value) {
		this->value = value;
	}

	int get_value() {
		return this->value;
	}

	ListNode* get_next() {
		return this->next;
	}

};

//判断链表成环
bool is_ring(ListNode* a) {
	ListNode* fast = a,*slow = a;
	while (fast->get_next()) {
		fast = fast->get_next();
		if (fast->get_next() && slow->get_next() && fast != slow) {
			fast = fast->get_next();
			slow = slow->get_next();
		}

		if (fast == slow) {
			return true;
		}
	}
	return false;
}

//寻找入环点(默认成环)
int find_ring(ListNode* a) {
	ListNode* fast = a->get_next()->get_next(), * slow = a->get_next();

	while (fast != slow) {
		fast = fast->get_next()->get_next(); 
		slow = slow->get_next();
	}

	ListNode* slow2 = a;

	while (fast != slow2) {
		fast = fast->get_next()->get_next();
		slow2 = slow2->get_next();
	}

	return slow2->get_value();
}


//原地翻转链表
ListNode* reverse_list(ListNode* a) {
	ListNode* temp = new ListNode(0);

	ListNode* h = NULL;

	while(a->get_next()) {
		temp = a;
		a = a->get_next();
		temp->add_node(h); 
		h = temp;
	}
	return temp;
}


int main() {
	ListNode* a1 = new ListNode(1);
	ListNode* a2 = new ListNode(2);
	ListNode* a3 = new ListNode(3);
	ListNode* a4 = new ListNode(4);
	ListNode* a5 = new ListNode(5);

	a1->add_node(a2);
	a2->add_node(a3);
	a3->add_node(a4);
	a4->add_node(a5);
	a5->add_node(a1);

	reverse_list(a1);
}

以上是关于手写数据结构:链表的主要内容,如果未能解决你的问题,请参考以下文章

前端面试题之手写promise

恋上数据结构 链表(手写LinkedList+练习)

2020-11-03:手写代码:链表如何快速找到中间节点?

从0开始手写ArrayList动态数组和LinkedList双向链表

从0开始手写ArrayList动态数组和LinkedList双向链表

Data Structure