考研算法必会|单链表获取某个元素 、单链表插入元素

413 阅读2分钟

这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战

考研算法必会

初始化操作

(初始化带头结点的单链表,构造一个空的单链表,初始化next指针 )

//初始化操作(初始化带头结点的单链表,构造一个空的单链表,初始化next指针 )
#define OK 1
#define ERROR 0
int InitLinkList(LinkList &L){
	L = (LinkList)malloc(sizeof(LNode));
	if(L!=NULL){
		L->next = NULL;
		return OK;
	}
	else{
		return ERROR;
	} 
} 

单链表获取某个元素

算法思路:

  1. 声明一个节点 p 指向链表的第一个节点,初始化 j 作为计数器,从 1 开始
  2. 当 j<i 的时候,遍历链表,让 p 不断向后移动,计数器 j+1
  3. 查找成功时,返回节点
  4. 当到了链表的末尾即 p 为空时,则说明第 i 个元素不存在

单链表按值查找结点值

//按值查找结点值
LNode *LocateElem(LinkList L,ElemType e){
	LNode *p=L->next;
	while(p&&p->data!=e){
		p=p->next;
	}
	return p;
}

代码分析:

注意代码的可读性和拓展性

单链表插入元素

在任意位置插入一个节点 s,数据域值为 e 的节点,要如何实现呢?

s->next = p->next; //第一步

p->next = s; //第二步

首先将 p 的后继节点 p->next 修改为 s 的后继节点,然后将节点 s 修改 p 的后继节点。 注意:顺序不能颠倒,如果颠倒了 p->next=s;s->next=p->next,这种情况下由于先断开了 p 与p->next之间的关系,进而导致了 s->next找不到后继节点。

单链表第 i 个数据插入节点的算法思想:

  1. 声明一个节点 p 指向链表的第一个节点,初始化 j 作为计数器从 1 开始。
  2. 当 j<i 时,遍历链表,使 p 指针向后移动,不断指向下一个节点,此时 j+1。 3. 如果遍历到链表尾部,则说明第 i 个元素不存在。
  3. 否则查找成功,创建一个空节点 s。
  4. 将数据 e 赋值给 s->data。
  5. 单链表插入:s->next = p->next; p->next = s;。
  6. 返回成功,算法结束。

单链表插入节点操作代码实现


//插入节点操作
//求链表长度
int LinkLen(LinkList L,int i=0){
	LinkList *Node;
	while(L->next!=NULL){
		i++;
		L=L->next;
	}
	return i;
	
} 
LinkList InsertElem(LinkList &L,int i){
	int length;
	length=LinkLen(L);
	if(i>0&&i<=length){	
		LNode *node;
		int x;
		scanf("%d",&x);
		node->data=x;
		LNode *p = L->next;
		for(int j=1;j<i;j++){
			p=p->next;
		}
		node->next=p->next;
		p->next=node;
	} 
	return L;
}