单链表的若干问题

简介:

(1).试编写算法将带头结点单链表就地逆置,所谓“就地”是指辅助空间为O(1)

【解析】

此问题有两种解法。

a 把头节点摘下来,然后用头插法建链表就形成所谓的就地逆置
b 依次遍历将指针反转,不过最后一个节点需要注意一下
两算法时间复杂度都是O(n),空间都是O(1)

【算法】

第一种算法:

//就地反转
int LinkListRerverse(LinkList *head){
	LinkList *q,*p;
	p = head->next;
	head->next = NULL;
	while(p != NULL){
		q = p->next;
		p->next = head->next;
		head->next = p;
		p = q;
	}
	return 0;
}

完整例子:

#include<stdio.h>
#include<malloc.h>

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

//就地反转
int LinkListRerverse(LinkList *head){
	LinkList *q,*p;
	p = head->next;
	head->next = NULL;
	while(p != NULL){
		q = p->next;
		p->next = head->next;
		head->next = p;
		p = q;
	}
	return 0;
}
//输出数据
int LinkListPrintf(LinkList *head){
	LinkList *p;
	p = head;
	while(p->next){
		p = p->next;
		printf("%d ",p->data);
	}
	printf("\n");
	return 0;
}
//创建链表
int LinkListCreate(LinkList *head,int n){
	LinkList *p,*newNode;
	head->next = NULL;
	p = head;
	//输入数据
	for(int i = 0;i < n;i++){
		//创建节点
		newNode = (LinkList*)malloc(sizeof(LinkList));
		scanf("%d",&newNode->data);

		newNode->next = p->next;
		p->next = newNode;
		p = newNode;
	}
	return 0;
}

int main()
{
	int n;
	while(scanf("%d",&n) != EOF){
		LinkList *head;
		head = (LinkList*)malloc(sizeof(LinkList));
		//创建链表(n个节点)
		LinkListCreate(head,n);
		//输出已建链表
		LinkListPrintf(head);
		//就地反转
		LinkListRerverse(head);
		//输出反转后结果
		LinkListPrintf(head);
	}
	return 0;
}


目录
相关文章
|
5月前
|
存储
数据结构实验之链表一:顺序建立链表
数据结构实验之链表一:顺序建立链表
|
5月前
|
算法 程序员
【算法训练-链表 六】【链表查找】:链表中倒数第k个节点
【算法训练-链表 六】【链表查找】:链表中倒数第k个节点
27 0
|
5月前
数据结构单链表之删除给定位置的链表节点 | 第五套
数据结构单链表之删除给定位置的链表节点 | 第五套
39 0
|
6月前
|
存储 算法
代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II
代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II
|
6月前
|
算法
单链表(面试算法题3)---两链表相交问题
单链表(面试算法题3)---两链表相交问题
26 0
|
7月前
|
C++
剑指offer(C++)-JZ52:两个链表的第一个公共结点(数据结构-链表)
剑指offer(C++)-JZ52:两个链表的第一个公共结点(数据结构-链表)
|
9月前
|
算法
代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 (面试题) 02.07. 链表相交 142.环形链表II
代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 (面试题) 02.07. 链表相交 142.环形链表II
|
10月前
|
Java
java数据结构21:按大小顺序建立单链表并按要求删除节点
输入的每一行是姓名和年龄。读入每个人的信息,按年龄从小到大建立一个单链表。 按示例格式输出这个单链表。 删除链表中所有年龄是偶数的节 点,按示例格式输出剩下的所有节点。 要求:必须删除节点,不能只是跳过节点不输出。
46 0
|
11月前
剑指offer 54. 两个链表的第一个公共结点
剑指offer 54. 两个链表的第一个公共结点
53 0
|
算法
大厂面试经典单链表例题(创建有序单链表,逆置单链表,判断链表是否有环,取链表中间节点)(含核心代码与解析)
大厂面试经典单链表例题(创建有序单链表,逆置单链表,判断链表是否有环,取链表中间节点)(含核心代码与解析)