数据结构 线性表算法(二)

数据结构 线性表算法(二)

链表的插入,删除,在原地合并排序链表

// 线性表算法.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 这个文件主要用于实现一些线性表的功能,包括顺序线性表,静态链表,循环链表,双向链表
// 以及一个用链表实现的多项式
// 为了方便和演示算法,顺序线性表直接使用了C++ STL库中的vector

#include "pch.h"
#include <iostream>
using namespace std;
/*
	创建两个类,一个表示链表中的节点,有val和next两个变量,一个表示整个链表,保存链表的head指针
*/
class node {
public:
	int val;
	node *next;
	node(int v) {
		val = v;
	}
	node() {

	}
};

class linkList {
public:
	node *head;
	linkList(int v) {
		node *h = new node(v);
		head = h;
	}
	linkList() {
		head = NULL;
	}
	/*
		为了验证链表的一些算法,需要一个输出链表元素的函数
	*/
	void printList() {
		node *cur = head;
		while (cur != NULL) {
			cout << cur->val << " ";
			cur = cur->next;
		}
		cout << endl;
	}

	/*
		链表长度
	*/
	int getLen() {
		int n = 0;
		node *cur = head;
		while (cur != NULL) {
			cur = cur->next;
			n++;
		}
		return n;
	}

	/*
		为了可以在头部插入,这里的插入我定义为插入在pos位置。
	*/
	void insert(int pos, int val) {
		if (pos == 0) {   //插入在头部
			node *temp = new node(val);
			temp->next = head;
			head = temp;
			return;
		}
		node *cur = head;
		while (pos - 1 > 0) {
			if (cur->next == NULL) // 当pos大于链表的长度,插入在尾部
				break;
			cur = cur->next;
			pos--;

		}
		node *temp = new node(val);
		temp->next = cur->next;
		cur->next = temp;
		return;
	}

	/*
		如果pos大于链表长度,那么不会删除
	*/
	void Delete(int pos) {
		if (pos == 0) {
			if (!head)
				return;
			head = head->next;
			return;
		}
		node *cur = head;
		while (pos - 1 > 0) {
			if (cur->next == NULL) {

				return;
			}
			cur = cur->next;
			pos--;
		}
		if (cur->next == NULL) {
			cur = NULL;
			return;
		}
		cur->next = cur->next->next;
		return;
	}


};

/*
	合并两个排序链表,保存在l1当中,并且会舍弃掉重复的元素,不需要额外的链表
*/
void merge_sorted_linklist(linkList &l1, linkList &l2) {
	node *cur1 = l1.head, *cur2 = l2.head;

	// 11 13 15 17 19
	// 2 4 6 20
	while (cur1 && cur2) {
		if (cur1->next == NULL) {
			cur1->next = cur2;
			return;
		}
		if (cur1->val < cur2->val) {
			if (cur1->next->val > cur2->val) {
				node *temp = new node(cur2->val);
				cur2 = cur2->next;
				temp->next = cur1->next;
				cur1->next = temp;
				cur1 = cur1->next;
			}
			else if (cur1->next->val <= cur2->val)
				cur1 = cur1->next;
		}
		else if (cur1->val == cur2->val)
			cur2 = cur2->next;
		else {  //这种情况只可能出现在cur1在head位置时
			while (cur2->next->val < cur1->val) {
				cur2 = cur2->next;
				if (cur2->next == NULL) {
					cur2->next = cur1;
					cur1 = cur2;
					return;
				}
			}
			node *temp = cur2->next;
			cur2->next = cur1;
			cur2 = temp;
			swap(l1.head, l2.head);
		}
	}


}



int main()
{
	linkList l1(11), l2(2);
	l1.insert(l1.getLen(), 13);
	l1.insert(l1.getLen(), 15);
	l1.insert(l1.getLen(), 17);
	l1.insert(l1.getLen(), 19);
	l1.insert(l1.getLen(),	21);
	l1.Delete(l1.getLen() - 1);

	l2.insert(l2.getLen(), 4);
	l2.insert(l2.getLen(), 6);
	l2.insert(l2.getLen(), 20);

	l1.printList();
	l2.printList();

	merge_sorted_linklist(l1, l2);
	l1.printList();
	l2.printList();
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值