数据结构--链表

一、链表的基本操作

(1) 遍历(统计链表长度)

(2) 查找链表中某元素

(3) 在链表中插入某节点

a. 链表头插入
b. 链表尾插入
c.给定节点之后插入

(4) 在链表中删除某结点

a. 删除给定结点之后的结点
b. 删除给定结点(并返回删除后的链表的头结点)

二、代码实现

class MyList{
public:
	class Node{
	public:
		Node(int data){
			this->value = data;
			this->next = nullptr;
		}
		Node(int data, Node* next){
			this->value = data;
			this->next = next;
		}
	public:
		int value;
		Node* next;
	};

	// 遍历链表
	int travel(Node* head){
		Node* p = head;
		while(p){
			cout << p->value << endl;
			p = p->next;
			++this->count;
		}
		return this->count;
	}

	// 查找链表中某元素
	Node* find(int value){
		Node* p = dummyHead->next;
		while(p){
			if(p->value == value){
				return p;
			}
			p = p->next;
		}
		return nullptr;
	}

	// 在链表中插入某节点
	/// 链表头插入
	void insertAtHead(int value){
		Node* newnode = new Node(value);
		newnode->next = dummyHead->next;
		dummyHead->next = newnode;
		while(!tail->next){		// 在插入多个头结点后,tail指针需要及时更新
			tail = tail->next;
		}
	}
	/// 给定节点之后插入
	void insertAfter(Node* p, int value){
		if(!p)
			return;
		Node* newnode = new Node(value);
		newnode->next = p->next;
		p->next = newnode;
		while(!tail->next){
			tail = tail->next;
		}
	}
	
	// 在链表删除某节点
	/// 删除给定节点之后的节点
	void deleteNextNode(Node* p){
		if(!p || !p->next){
			return;
		}
		p->next = p->next->next;
	}
	/// 删除给定节点(并返回删除后的链表的头结点)
	Node* deleteThisNode(Node* p){
		if(!p || !dummyHead->next)
			return nullptr;
		Node* prev = dummyHead;
		Node* q = dummyHead->next;
		while(q){
			if(q == p)
				break;
			prev = q;
			q = q->next;
		}
		if(!q)
			return dummyHead->next;
		prev->next = prev->next->next;
		return dummyHead->next;
	}
public:
	int nSize = 0;
	Node* dummyHead = new Node(0);
	Node* tail = dummyHead;
};

测试例子

int main() {
	MyList A;
	MyList::Node* p1 = new MyList::Node(1, nullptr);
	MyList::Node* p2 = new MyList::Node(2, nullptr);
	MyList::Node* p3 = new MyList::Node(3, nullptr);
	MyList::Node* p4 = new MyList::Node(4, nullptr);
	MyList::Node p5(9, nullptr);

	A.insertAtHead(7);
	A.insertAtTail(8);
	A.insertAtHead(9);
	A.insertAfter(A.vhead->next,10);
	A.insertAfter(A.tail, 20);
	A.insertAtTail(30);
	A.travel(A.vhead->next);
	cout << "------------------" << endl;
	p3 = A.find(20);
	p4 = A.find(7);
	A.deleteNextNode(A.vhead->next);
	//A.travel(A.vhead->next);
	//cout << "******************" << endl;
	A.deleteThisNode(A.vhead->next);
	A.travel(A.vhead->next);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值