【算法面试】一道反转链表算法题

本文深入解析了逆转单链表算法,详细介绍了结构体定义、指针操作及逆转过程。通过实例代码演示了如何使用三个指针进行节点的逆转,并提供了完整的C语言实现。

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

一道算法题

逆转单链表

0->1->2->3->4

这道题,看起来非常简单,其实隐藏了许多知识点。

1. 知识点

首先,我们要知道结构体的定义,如何起别名,如何定义结构体指针。

这三点代码如下:

typdef struct node 
{
	int key;
   struct node *next;
} Node;

  • 结构体定义用struct关键字
  • 起别名用typedef关键字
  • 定义结构体指针struct node *

2. 算法

这个算法其实蛮好想,就是要自己拿张草稿子画一画,就出来了。做题一定要心中有数,拿出你的笔和纸,心中有许多杂念,90%的我等凡夫俗子是想不清楚的。

闲话少扯,继续谈算法,我们首先想到的是,要改当前节点next指针,指向上一个节点,是不是首先要记录下一个节点,和上一个节点的位置?
所以我们需要3个指针:pre-记录上一个节点p-当前要改变的节点, q-下一个节点

我们的思路就是:

  1. 先弄三个指针,记录开始的三个节点;
  2. 让当前节点next指针指向上一个节点;
  3. pre指向当前节点;当前节点指针 和下一个节点指针分别往后移动;

最后注意开头节点next = NULL, 和最后一个节点指向pre。

给出源代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node 
{
	int key;
	struct node *next;
} Node;

Node* revertLinkList(Node *head) 
{
	if(head == NULL) 
	{
		return NULL;
	}

	Node *p, *q, *pre;

	// 三个指针,分别指向当前节点,后一个节点,上一个节点
	p = head -> next;
	q = p -> next;
	pre = head;

	while(q != NULL)
	{
		// 当前节点的next指针往前指
		p -> next = pre;
		printf("change key: %d\n", pre->key);
		// 上一个节点指向当前节点
		pre = p;
		// 当前节点指针往后移,下一个节点指针也往后移
		p = q;
		q = q -> next;
		// 继续下次循环
	}

	// 注意头节点next置空
	p -> next = pre;
	// 新的头节点指向他的上一个
	head -> next = NULL;	
	
	return p;	
}

/**
* 打印链表
*/
void outputLinkList(Node *head) 
{
	while(head != NULL) 
	{
		printf("println key:%d\n", head->key);
		head = head -> next;
	}
}


int main() 
{
	Node *head = NULL;
	Node *p, *pre;
	
	head = malloc(sizeof(Node));
	pre = head;
	int n = 5;
	int i = 1; 

	while(i < n) 
	{
		p = malloc(sizeof(Node));
		p -> key = i;
		pre -> next = p;		
		pre = p;
		i ++;
	}
	p -> next = NULL;	
		
	outputLinkList(head);

	head = revertLinkList(head);

	outputLinkList(head);
	
	// 缺一步删除链表的操作

	return 0;	
}

总结来说,就是做算法脑子一定要非常清晰,没有想清楚,请不要写代码。
以上是这次的分享。谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值