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

一,
非递归方式实现
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Stack;

/**
 * 输入一链表的头结点,从尾到头反过来打印出每个结点的值
 * 非递归方式实现
 */
public class Revertlist {
    public static void main(String[] args) throws ParseException {
        MySingleLinkList  node1=new MySingleLinkList();
        MySingleLinkList  node2=new MySingleLinkList();
        MySingleLinkList  node3=new MySingleLinkList();
        node1.data=1;
        node2.data=2;
        node3.data=4;
        node1.next=node2;
        node2.next=node3;
        revertList(node1);

    }
    public static void revertList(MySingleLinkList headNode){
        Stack<MySingleLinkList> stack = new Stack<MySingleLinkList>();
        while(headNode!=null) {
            stack.push(headNode);
            headNode = headNode.next;
        }
        while(!stack.empty()){
            System.out.println(stack.pop().data);
        }
    }

}
二,递归方式实现

/**
 * 输入一链表的头结点,从尾到头反过来打印出每个结点的值
 * 递归方式实现
 */
public class RevertListRecur {
    public static void main(String[] args){
        MySingleLinkList  node1=new MySingleLinkList();
        MySingleLinkList  node2=new MySingleLinkList();
        MySingleLinkList  node3=new MySingleLinkList();
        node1.data=1;
        node2.data=2;
        node3.data=4;
        node1.next=node2;
        node2.next=node3;
        revertList(node1);
    }
    public static void revertList(MySingleLinkList headnode){
        if(headnode!=null){
            if(headnode.next!=null){
                revertList(headnode.next);
            }
        }
        System.out.println(headnode.data);
    }
}


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、付费专栏及课程。

余额充值