链表

1.单链表

定义:别忘构造函数,struct与class无异。

// Definition for singly-linked list.
struct SinglyListNode {
    int val;
    SinglyListNode *next;
    SinglyListNode(int x) : val(x), next(NULL) {}
};

时间复杂度:查找O(n),插入O(1),删除有O(n)和O(1)。

自写简单的链表实现:

其类实现参见:链接

#include "stdafx.h"
#include <iostream>

using namespace std;

// Definition for singly-linked list.
struct SinglyListNode {
	int val;
	SinglyListNode *next;
	SinglyListNode(int x = 0, SinglyListNode * y = nullptr) : val(x), next(y) {}
};

void Display(SinglyListNode * root)//从头到尾打印链表
{
	SinglyListNode * node = root;
	while (node != nullptr)
	{
		cout << node->val << ' ';
		node = node->next;
	}
	cout << endl;
}
void DeleteOne(SinglyListNode * root, int value)//删除指定值
{
	SinglyListNode * node1 = root;
	SinglyListNode * node2 = root;
	while (node2->val != value)
	{
		node1 = node2;
		node2 = node2->next;
	}
	node1->next = node2->next;
	delete  node2;
}
void AddAtTail(SinglyListNode * root, int value)//尾部添加
{
	SinglyListNode * node = root;
	while (node->next != nullptr)
	{
		node = node->next;
	}
	SinglyListNode *node1 = new SinglyListNode(value);
	node->next = node1;

}

int main()
{
	//SinglyListNode *node1 = &SinglyListNode(4);//也可,但是删除时要注意不能用delete

	SinglyListNode *node1 = new SinglyListNode(4);
	SinglyListNode *node2 = new SinglyListNode(5, node1);
	SinglyListNode *node3 = new SinglyListNode(6, node2);
	Display(node3);

	DeleteOne(node3, 5);
	Display(node3);
	AddAtTail(node3, 10);
	Display(node3);


	system("pause");

	return 0;
}


单链表相关操作:

判断链表是否有环及环的长度、反转链表、两个链表的第一个公共节点、倒数第K个节点等(剑指offer)。

2.双链表

定义:和二叉树的定义是一样的。

// Definition for doubly-linked list.
struct DoublyListNode {
    int val;
    DoublyListNode *next, *prev;
    DoublyListNode(int x) : val(x), next(NULL), prev(NULL) {}
};

提供链表和其他数据结构(包括数组,队列和栈)之间时间复杂度的比较: 


版权声明:本文为Echo1214_Xie原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。