输入个链表的头结点,从尾到头反过来打印出每个结点的值

本文介绍了一种使用迭代和栈数据结构逆序打印链表节点值的方法。通过将链表节点压入栈中,再逐个弹出并打印节点值,实现从尾到头的逆序打印。
输入个链表的头结点,从尾到头反过来打印出每个结点的值
 public static void printListInverselyUsingIteration(ListNode root) {
        Stack<ListNode> stack = new Stack<>();
        while (root != null) {
            stack.push(root);
            root = root.nxt;
        }
        ListNode tmp;
        while (!stack.isEmpty()) {
            tmp = stack.pop();
            System.out.print(tmp.val + " ");
        }
    }

 

C语言中的链表是一种数据结构,它由一系列节点组成,每个节点包含两个部分:数据域和指针域。在这个问题中,你需要编写一个函数来逆序处理一个单向链表。给定一个链表头结点作为输入,函数的主要步骤如下: 1. 定义一个辅助变量`prev`,初始化为NULL,用于保存当前节点的前一个节点。 2. 使用一个循环,遍历整个链表: a. 获取当前节点`curr`,如果它是 `-1`(链表结束符),说明已经到达部,跳循环。 b. 将`curr`的下一个节点`next`设为`prev`,以便更新链表连接。 c. 更新`prev`为`curr`,继续遍历。 d. 记录`curr`的数据(通常是一个整数)并将其添加到结果数组中。 3. 当遍历结束后,将`prev`设为结果数组的第一个元素,因为它现在指向了新的“头”节点。 C语言的具体实现可能会像这样: ```c #include <stdio.h> typedef struct Node { int data; struct Node* next; } Node; // 函数声明 int* reverseList(Node* head); // 辅助函数,返回倒数第二个节点 Node* getPrevLastNode(Node* head) { if (head == NULL || head->next == NULL) return head; Node* prev = head; while (prev->next->next != NULL) { prev = prev->next; } return prev; } // 主函数 void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { // 示例链表输入 Node* list = (Node*)malloc(sizeof(Node)); list->data = 1; list->next = (Node*)malloc(sizeof(Node)); list->next->data = 2; ... // 更多节点的创建 list->next->next->data = -1; // 反转链表并将结果存储在一个数组中 int* reversedArr = reverseList(list); // 输结果数组 printArray(reversedArr, reversedArr[0] == -1 ? 0 : reversedArr[0] + 1); free(reversedArr); // 释放内存 return 0; } // 实现链表反转 int* reverseList(Node* head) { if (head == NULL) return NULL; Node* prev = getPrevLastNode(head); int* result = (int*)malloc(sizeof(int) * (prev == head ? 1 : 0)); // 分配内存 Node* curr = head; while (curr != prev) { result[0] = curr->data; result++; curr = curr->next; } result[0] = prev->data; // 包含结符 return result; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值