04-MOOC-链表

本文深入探讨了链表数据结构,包括如何进行头指针的插入和删除操作。介绍了C语言中初始化链表、创建节点、查找第K个节点、在K处插入和删除节点的方法,并对比了Java实现的简洁性。同时,提到了C++实现的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键词:链表,增删改查操作。


head pointer  插入删除会影响头指针
  |
 ??? [ ] -> [ ] -> [ ]

head node  常用方法,即头指针为空
[x] -> [ ] -> [ ]

C实现

初始化

struct Node {
	int data;
	struct Node* next;
};

//typedef struct Node* LList; 取别名


void init(struct Node** phead ) {
	*phead = NULL;
}

创建节点

struct Node* createNode(int x) {
	struct Node* t;
	t = (struct Node*)malloc(sizeof(struct Node));
	t->next = NULL;
	t->data = x;
	return t;
}

查找第K个节点

struct Node* findKth(struct Node* head, int k) {
	int count =1;
	struct Node* p;
	p = head;
	while(p && count <k) {
		p = p->next;
		count++;
	}
	return p;
}

在K处插入节点


int insert(struct Node** phead, int k, int x ) {
	if (k<0) {
		return 0;
	} else if(k==1) {
		struct Node* t;
		t = createNode(x);
		t->next = *phead;
		*phead = t;
		return 1;
	} else {
		struct Node* p;
//	先找第k-1 个位置
		p = findKth(*phead, k-1);
		/*
			printf("\n第k-1位置的值是%d\n",p->data);
			出错!因为p->data 在 p 为空时为空!

		*/
		if(p) {
			struct Node* t;
			t = createNode(x);
			t->next = p->next;
			p->next = t;
			return 1;
		} else {
			return 0;
		}
	}

}

删除第K个节点


int removeNode(struct Node** phead, int k, int *px) {
	if (k<0) {
		return 0;
	} else if(k==1) {
		if(*phead) {
			*px = (*phead)->data;
			*phead = (*phead)->next;
			return 1;
		} else {
			return 0;
		}
	} else {
		struct Node* p;
		p = findKth(*phead, k);

		if (p==NULL || p->next==NULL) {
			return 0;
		}
		struct Node* t;
		t = p->next;
		p->next = t->next;
		*px = t->data;
		free(t);
		return 1;
	}
}

获取链表长度,打印链表

int getLength(struct Node* head) {
	int len = 0;
	while(head) {
		len++;
		head = head->next;
	}
	return len;
}

void printList(struct Node* head) {
	printf("链表:");
	while(head) {
		printf("%d,", head->data);
		head = head->next;
	}
	printf("\n");
}

Java有很多封装的包,实现更简单。

package n3_LinearStructure;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Stack;

public class LinkList {

	public static void main(String[] args) {

		LinkedList<Integer> a = new LinkedList<>();
		a.add(11);
		a.add(22);
//		a.remove(11);

		System.out.println(a);
		// [11, 22]
	}

}

C++实现较为尴尬。

 

#include <iostream>
#include <list>
#include <vector>
#include <stack>
using namespace std;

int main(){
	list<int> a;
	a.push_back(11);
	a.push_back(22);
	a.push_back(33);
//	list<int>::iterator it;
//	for (it=a.begin(); it!=a.end(); it++){
//		cout << &(*it) << "," << *it << endl;
//	}

	for(auto it:a )cout<< it<<endl;
	
	
	cout << endl;
	
	return 0;
}




 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值