Linked list of C++ data structure

What is a linked list?

  A linked list is a collection of nodes that store data and connect to other nodes. In this way, nodes can be located anywhere in memory, and each node stores the addresses of other nodes in the linked list, so data can easily travel from one node to another.


1. One-way linked list

  If a node has a pointer to another node as a data member, then multiple such nodes can be chained to access the entire sequence of nodes with just one variable.
  If the nodes in the sequence only contain links to subsequent nodes, the linked list is called a singly linked list.

Reference example: Jianzhi offer interview question 24 - reverse linked list

#include<iostream>
#include<vector>
#include<stack>
#include<list>
using namespace std;
struct ListNode{
    
    
    int val;
    struct ListNode *next;
    ListNode(int x):
        val(x),next(NULL){
    
    }
};
class Solution{
    
    
    public:
        vector<int> printListFromTailToHead(ListNode* head){
    
    
            stack<int> nodes; //后进后出的栈
            vector<int> result;//先进后出的容器
            ListNode* node = head;
            while ((node != NULL))
            {
    
    
                nodes.push(node->val);
                node = node->next;
            }
            while (!nodes.empty()){
    
    
                result.push_back(nodes.top());
                nodes.pop();
            }
            return result;
        }
};
int main(){
    
    
    ListNode *one = new ListNode(1);
    ListNode *two = new ListNode(2);
    ListNode *three = new ListNode(3);
    ListNode *four = new ListNode(4);
    ListNode *five = new ListNode(5);
    ListNode *six = new ListNode(6);
    one->next=two;
    two->next=three;
    three->next=four;
    four->next=five;
    five->next=six;
    six->next=NULL;
    Solution s;
    vector<int> v;
    v=s.printListFromTailToHead(one);
    int len=v.size();
    for(int i=0;i<len;i++)
        cout<<v[i]<<' ';
    cout<<endl;
    return 0;

}
		

Two, doubly linked list

  There is an inherent problem in a singly linked list, the nodes in this linked list only contain pointers to the successor nodes, so that the predecessor nodes cannot be accessed quickly. In order to speed up the processing of the linked list, the linked list can be redefined. Each node in the linked list has two pointers, one pointing to the predecessor and one pointing to the successor, and this linked list is called a doubly linked list.


#include <iostream>
using namespace std;
struct node 
{
    
    
	int date;
	node* prev;
	node* next;
};
 
class doublelink
{
    
    
public:
	int doublelink_insert(doublelink* ptr,int position,int member);
	int doublelink_erase(doublelink* ptr, int position);
	void doublelink_display(doublelink* ptr, int num);
	int doublelink_getlength(doublelink* ptr);
	doublelink()
	{
    
    
		root = new node;
		root->prev = NULL;
		root->next = NULL;
		length = 0;
 
	}
protected:
private:
	int length;
	node* root;
};
int doublelink::doublelink_erase(doublelink* ptr, int position)
{
    
    
	if (ptr->doublelink_getlength(ptr) == 0)
	{
    
    
		cout<<"链表为空,oop!!"<<endl;
		return 0;
	} 
	else
	{
    
    
		if (ptr->doublelink_getlength(ptr) == 1)
		{
    
    
			ptr->root->next = NULL;
			ptr->length--;
		} 
		else
		{
    
    
			node* deletenode = root->next;
			for (int i = 0 ; i < position; i++)
			{
    
    
				deletenode = deletenode->next;
			}
			deletenode->prev->next = deletenode->next;
			deletenode->next->prev = deletenode->prev;
			delete deletenode;
			ptr->length--;
		}
	}
}
void doublelink::doublelink_display(doublelink* ptr, int num)
{
    
    
	node* current = root->next;
	for (int i = 0; i < num; i++)
	{
    
    
		cout<<current->date<<" ";
		current = current->next;
	}
	cout<<endl;
}
int doublelink::doublelink_getlength(doublelink* ptr)
{
    
    
	return ptr->length;
}
int doublelink::doublelink_insert(doublelink *ptr, int position, int member)
{
    
    
	node* nodeinsert = new node;
	nodeinsert->date = member;
	if (ptr->doublelink_getlength(ptr) == 0)
	{
    
    
		root->next = nodeinsert;
		nodeinsert->prev = nodeinsert;
		nodeinsert->next = nodeinsert;
		ptr->length++;
		return 0;
	} 
	else
	{
    
    
		if (position == 0)
		{
    
    
			/*	root->next->prev = nodeinsert;
			nodeinsert->prev = root->next->prev;
			nodeinsert->next = root->next;
			root->next->prev = nodeinsert;*/
			nodeinsert->prev = root->next->prev;
			nodeinsert->next = root->next;
			root->next->prev->next = nodeinsert;
			root->next->prev = nodeinsert;
			root->next = nodeinsert;
			ptr->length++;
			return 0;
		} 
		else
		{
    
    
			node* current =  root->next;
			for (int i = 0; i < position; i++)
			{
    
    
				current = current->next;
			}
			nodeinsert->next = current;
			nodeinsert->prev = current->prev;
			current->prev->next = nodeinsert;
			//nodeinsert->next = nodeinsert;	
			current->prev = nodeinsert;
			ptr->length++;
			return 0;
		}
	}
}
 
 
int main()
{
    
    
 
	doublelink* doublelink_ptr = new doublelink;
	for (int i = 0; i < 10; i++)
	{
    
    
		doublelink_ptr->doublelink_insert(doublelink_ptr,0,i);
	}
	doublelink_ptr->doublelink_display(doublelink_ptr,20);
	doublelink_ptr->doublelink_erase(doublelink_ptr,2);
	doublelink_ptr->doublelink_display(doublelink_ptr,20);
	return 0;
}


Guess you like

Origin blog.csdn.net/Algabeno/article/details/120305423
Recommended