C++单链表创建、遍历、插入、删除结点、整体删除、反转

 C++单链表创建、遍历、插入、删除结点、整体删除、反转

单链表的定义

struct ListNode
{
	int val;
	ListNode *next;
};

创建单链表

void creatlist(ListNode*head,int N) {
	ListNode *pre = head;
	cin >> head->val;
	for (int i = 0; i < N-1; i++)
	{
		ListNode *ls = new ListNode;
		cin >> ls->val;
		ls->next = NULL;
		pre->next = ls;
		pre = ls;
	}
}

单链表遍历

void readlist(ListNode *head,int N) {
	ListNode*a;
	a = head;
	for (int i = 0; i < N; i++)
	{
		cout << a->val << " ";
		a = a->next;
	}
}

单链表插入结点

bool insertlist(ListNode*head, int n, int vals)
{
	int j = 1;
	ListNode*pp; ListNode*s;
	pp = head;
	while (pp&&j < n)
	{
		pp = pp->next;
		++j;
	}
	if (!pp || j > n) return false;
	s = new ListNode;
	s->val=vals;
	s->next = pp->next;
	pp->next = s;
	return true;
}

单链表删除结点

bool deletelist(ListNode * head, int i)
{
	int x = 1;
	ListNode*p2 = head;
	ListNode*q2;
	while (p2->next&&x < i)
	{
		p2 = p2->next;
		++x;
	}
	if (!(p2->next) || x > i) return false;
	q2 = p2->next;
	p2->next = q2->next;
	delete q2; 
	return true;
}

单链表整体删除

bool clearlist(ListNode*head)
{
	ListNode*p;
	ListNode*q;
	p = head;
	while (p)
	{
		q = p->next;
		delete p;
		p = q;

	}
	return true;
}

示例

#include <iostream>
#include <string>
#include <vector>
#include "stdio.h"
using namespace std;
struct ListNode
{
	int val;
	ListNode *next;
};
void creatlist(ListNode*head,int N) {
	ListNode *pre = head;
	cin >> head->val;
	for (int i = 0; i < N-1; i++)
	{
		ListNode *ls = new ListNode;
		cin >> ls->val;
		ls->next = NULL;
		pre->next = ls;
		pre = ls;
	}
}
void readlist(ListNode *head,int N) {
	ListNode*a;
	a = head;
	for (int i = 0; i < N; i++)
	{
		cout << a->val << " ";
		a = a->next;
	}
}
ListNode * reverselist(ListNode*head)
{
	if (head == nullptr)return head;
	ListNode *dummy = new ListNode;
	dummy->next = head;
	ListNode*prev = head;
	ListNode*pcur = prev->next;
	while (pcur!=nullptr)
	{
		prev->next = pcur->next;
		pcur->next = dummy->next;
		dummy->next = pcur;
		pcur = prev->next;
	}
	return dummy->next;

}
bool clearlist(ListNode*head)
{
	ListNode*p;
	ListNode*q;
	p = head;
	while (p)
	{
		q = p->next;
		delete p;
		p = q;

	}
	return true;
}
bool insertlist(ListNode*head, int n, int vals)
{
	int j = 1;
	ListNode*pp; ListNode*s;
	pp = head;
	while (pp&&j < n)
	{
		pp = pp->next;
		++j;
	}
	if (!pp || j > n) return false;
	s = new ListNode;
	s->val=vals;
	s->next = pp->next;
	pp->next = s;
	return true;
}

bool deletelist(ListNode * head, int i)
{
	int x = 1;
	ListNode*p2 = head;
	ListNode*q2;
	while (p2->next&&x < i)
	{
		p2 = p2->next;
		++x;
	}
	if (!(p2->next) || x > i) return false;
	q2 = p2->next;
	p2->next = q2->next;
	delete q2; 
	return true;
}

int main()
{
	ListNode *head = new ListNode;
	int N = 0;
	cout << "输入链表长度" << endl;
	cin >> N;
	cout << "创建链表" << endl;
	creatlist(head, N);
	cout << "读取链表" << endl;
	readlist(head, N);
	cout << endl;
	cout << "清空链表" << endl;
	//cout << clearlist(head) << endl;
	cout << "插入链表" << endl;
	cout << insertlist(head,2,4) << endl;
	readlist(head, N+1);
	cout <<endl<< "单链表节点删除" << endl;
	cout << deletelist(head,2) << endl;
	readlist(head, N);
	cout << endl;
	cout << "反转链表" << endl;
	ListNode *rever = reverselist(head);
	readlist(rever, N); cout << endl;
	return 0;
}



 

上一篇:Go中定时器实现原理及源码解析


下一篇:面向对象的多态性和方法的重写与重载