您的当前位置:首页正文

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

2024-11-10 来源:个人技术集锦

反转链表(java实现)

题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:

0 <= 节点个数 <= 5000 

一:非迭代解法(双指针法)

申请两个指针分别为previous和current

current:表示当前链表的位置(初始化指向头指针)

previous:表示前一位置(初始化指向空)

链表反转时,当前节点指向前一节点

即:current.next = previous;

(值得注意的是,当该步骤执行后,当前节点的下一节点会丢失

解决方法:在该步骤之前再申请一节点(temp)保存当前节点的下一节点位置。

即:temp=current.next;)

后 当前指针和前一指针向前移动

previous = current;

current = temp;

完整代码为:

ListNode pre = null;
ListNode current = head;
ListNode temp = null;
while (current != null) {
    //保存后一个结点的位置
    temp = current.next;
    //将当前节点指向上一节点
    current.next = pre;
    //当前和前一位置向后移动
    pre = current;
    current = temp;
}
return pre;

二:递归解法

递归问题:1:一个问题可以分为若干个子问题

​ 2:某些子问题是原子的,另外一些子问题与原问题的逻辑相同

​ 典型的有汉诺塔问题,求阶乘

​ **注:**然而对于一个问题,能用循环就不用递归(前提是循环结构实现起来比较简单)

​ 递归问题的本质实质就是对栈的使用。

递归结构:

public Status digui(参数0,1,2…){

​ if(终止条件){

​ return;

​ }

​ 逻辑处理(原子,可以存在也可以不存在)

​ //递归调用

​ digui(参数0,1,2…);

​ 逻辑处理(原子,可以存在也可以不存在)

}

对于本题递归时从链表的末尾进行翻转,依次向前

代码实现

public ListNode reverseList(ListNode head) {
    //终止条件当前为空或者下一节点为空
    if (head == null || head.next == null)
        return head;
    //递归调用,找到链表末尾
    ListNode current = reverseList(head.next);
    //对节点进行翻转
    ListNode temp = head.next;
    temp.next = head;
    //此时head表示链表的最后一个节点,应指向null
    head.next = null;
    return current;
}

若有相同请联系我更改

显示全文