数据结构

32 阅读2分钟

一、链表

1、链表及其基础功能实现

#include <iostream>
using namespace std;  // 使用命名空间,避免每次都写 std::

struct Node{
	int data;
	struct Node* next;
};
//任意位置插入 
void Insert(Node** head, int value, int n){
	Node* temp = new Node();
	temp -> data = value;
	temp -> next = NULL;
	if(n == 1){
		temp -> next = *head;
		*head = temp;
		return;
	}
	Node* temp1 = new Node();
	temp1 = *head;
	for(int i = 0; i < n -2; i++){
		if (temp1 == NULL || temp1 -> next == NULL){
			delete temp1;
			return;
		}
		temp1 = temp1 -> next;
	}
	temp -> next = temp1 -> next;
	temp1 -> next = temp;
}

void DeleteNode(Node** head, int n){
	Node* temp1 = *head;
	if(temp1 == NULL){
		return;
	}
	if(n == 1){
		*head = temp1 -> next;
		delete temp1;
		return;
	}
	for(int i = 0; i < n - 2; i++){
		temp1 = temp1 -> next;
	}
	Node* temp2 = temp1 -> next;
	temp1 -> next = temp2 -> next;
	delete temp2;
}

void Print(Node* head){
	Node* temp = head;
	while(temp != NULL){
		cout << temp -> data << endl;
		temp = temp -> next;
	}
}

int main(){
	Node* head = NULL;
	Insert(&head, 1, 1);//传输head的地址 
	Insert(&head, 2, 2);
	Insert(&head, 3, 3);
	DeleteNode(&head, 2);
	Print(head);
	return 0;
} 

2、翻转一个链表

#include<iostream>
using namespace std;

struct Node{
	int data;
	Node* next;
};

Node* head = NULL;
//末尾插入 
void Insert(int data){
	Node* temp = new Node;
	temp -> data = data;
	temp -> next = NULL;
	if(head == NULL){
		head = temp;
		return;
	}
	Node* tempPre = head;
	while(tempPre -> next != NULL){
		tempPre = tempPre -> next;
	}
	tempPre -> next = temp;
}
//打印 
void Print(){
	Node* temp = head;
	while(temp != NULL){
		cout << temp -> data;
		temp = temp -> next; 
	}
}
//翻转
void Reverse(){
	Node* preNode = NULL;
	Node* nowNode = head;
	Node* nextNode = NULL;
	while(nowNode != NULL){
		nextNode = nowNode -> next;
		nowNode -> next = preNode;
		preNode = nowNode;
		nowNode = nextNode;
	}
	head = preNode; 
} 


int main(){
	Insert(2);
	Insert(5);
	Insert(0);
	Print();
	Reverse();
	Print();
	// 这里没有return语句,但相当于return 0;
} 

3、打印链表(递归)

image.png

4、翻转链表(递归)

示例:

image.png

如果改为head不是全局变量则:

#include<iostream>
using namespace std;

struct Node{
	int data;
	Node* next;
};

void Insert(Node** head, int data){
	Node* temp1 = new Node();
	temp1 -> data = data;
	temp1 -> next = NULL;
	if(*head == NULL){
		*head = temp1;
		return;
	}
	Node* temp2 = *head; 
	while(temp2 -> next != NULL){
		temp2 = temp2 -> next;
	}
	temp2 -> next = temp1;
}

void Print(Node** head){
	Node* temp = new Node();
	temp = *head;
	if(temp == NULL){
		cout << "空链表" << endl;
		return;
	}
	while(temp != NULL){
		cout << temp -> data << " ";
		temp = temp -> next;
	}
}

void ReversePrint(Node* head){
	Node* temp = head;
	if(temp == NULL){
		return;
	}
	ReversePrint(temp -> next);
	cout << temp -> data << " ";
	return;
}

int main(){
	Node* head = NULL;
	Insert(&head, 2);
	Insert(&head, 4);
//	Print(&head);
	ReversePrint(head);
}