📜  门| GATE CS 2020 |问题 9(1)

📅  最后修改于: 2023-12-03 15:28:38.636000             🧑  作者: Mango

GATE CS 2020 | 问题 9

本篇文章将向程序员介绍 GATE CS 2020 的问题 9。该问题涉及反转链表中的一些基本操作和技巧。下面将逐步展开介绍。

问题描述

给出一个单向链表,每个节点包含一个整型值以及一个指向下一个节点的指针。

要求实现一个函数,它可以将链表中的每个节点都反转,并返回反转后的链表的首节点。

节点结构体定义如下:

struct Node {
  int value;
  struct Node* next;
};
思路分析

要逆转链表中的每一个节点,需要至少需要三个指针:一个指向当前节点、一个指向当前节点的前一个节点,以及一个指向当前节点的后一个节点。

第一步是创建三个指针:当前节点 p、前一个节点 prev 和后一个节点 next

struct Node* p = head;
struct Node* prev = NULL;
struct Node* next = NULL;

我们需要遍历整个链表,将每个节点的 next 指针指向其前一个节点。

while (p != NULL) {
  next = p->next;
  p->next = prev;
  prev = p;
  p = next;
}
head = prev;

注意,最后我们将链表的头节点指向最后一个节点,以保证反转后的链表正确。

代码实现

下面给出完整的代码实现。注意,该代码片段采用了C语言语法,使用前请注意调整。

struct Node* reverseLinkedList(struct Node* head) {
  if (head == NULL || head->next == NULL) {
    return head;
  }
  struct Node* p = head;
  struct Node* prev = NULL;
  struct Node* next = NULL;

  while (p != NULL) {
    next = p->next;
    p->next = prev;
    prev = p;
    p = next;
  }
  head = prev;
  return head;
}
总结

这篇文章介绍了 GATE CS 2020 的问题 9,详细讲解了逆转链表的基本操作和技巧。请注意,这里的代码示例仅作为参考,可根据需要进行调整。