手写数据结构:链表
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);
}
以上是关于手写数据结构:链表的主要内容,如果未能解决你的问题,请参考以下文章
从0开始手写ArrayList动态数组和LinkedList双向链表