链表 数据结构

链表, 一种抽象数据类型(ADT)的存储方式.

通过链式的动态存储, 用的时候创建节省空间.

想要删除某一个不想要的数据也更简单. 当找到这个节点的时候, 通过找到前驱节点, 将前驱节点与后继节点相连

再把当前节点释放掉就可以了.

同样数据增改也很轻松.

遍历, 不需要修改数据, 所以使用一级指针遍历就可以了

void
TransList(struct ListNode* header) {
	struct ListNode* walker = header;
	while (walker) {
		// printf("%d %s\n", walker->key, walker->value);
		walker = walker->next;
	}
}

头插法, 需要修改数据, 所以可以使用二级指针, 也可以使用一级指针(需要返回值)

void
InsertHead_ptrToptr(struct ListNode** hptr,
	struct ListNode* node) {
	struct ListNode** header = hptr;
	node->next = *header;
	*header = node;
}

struct ListNode*
InsertHead_ptr(struct ListNode* hptr,
	struct ListNode* node) {
	struct ListNode* header = hptr;
	node->next = header;
	header = node;

	return header;
}

尾插法, 需要修改数据, 所以可以使用二级指针, 也可以使用一级指针(因为要修改next的内容,

next是一级指针保存了要修改的节点的首地址, 所以不需要返回值, 我在这里加上了返回值)

void
InsertTail_ptrToptr(struct ListNode** hptr,
	struct ListNode* node) {
	struct ListNode** walker = hptr;
	while (*walker) {
		walker = &((*walker)->next);
	}
	node->next = NULL;
	*walker = node;
}

struct ListNode*
InsertTail_ptr(struct ListNode* hptr,
	struct ListNode* node) {
	struct ListNode* walker = hptr;
	while (walker->next) {
		walker = walker->next;
	}
	node->next = NULL;
	walker->next = node;

	return hptr;
}

删除节点元素, 遍历整个链表, 找到要删除的节点的前驱节点, 前驱节点的next指向删除的元素的后继节点.

我给出一级指针和二级指针的两种方法, 可以好好理解一下两种方法执行过程.

struct ListNode*
RemoveElement_ptr(struct ListNode* hptr,
	struct ListNode* node) {
	struct ListNode* walker = hptr;
	while (walker->next) {
		if (walker->next == node) {
			struct ListNode* deleteElem = walker->next;
			walker->next = deleteElem->next;
			deleteElem->next = NULL;
		}
		walker = walker->next;
	}

	return hptr;
}

void
RemoveElement_ptrToptr(struct ListNode** hptr,
	struct ListNode* node) {
	struct ListNode** walker = hptr;
	while (*walker) {
		if (*walker == node) {
			struct ListNode* deleteElem = *walker;
			*walker = ((*walker)->next);
			deleteElem->next = NULL;
		}
		walker = &((*walker)->next);
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值