23.反转链表

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

思考题:

  • 请同时实现迭代版本和递归版本。

数据范围:

链表长度 [0,30]。

样例:

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

代码:
1.迭代版本

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //初始化前驱节点为null
        ListNode p = null;
        //遍历链表直到当前节点为null(到达链表尾部)
        while(head!=null){
            //临时保留当前节点的下一个节点
            //避免修改当前节点的next指针后丢失后续链表
            ListNode q = head.next;
            //将当前节点的next指向前驱节点
            head.next = p;
            //当前节点称为新的前驱节点
            p = head;
            //当前节点后移,处理下一个节点
            head = q;
        }
        //返回新的头节点,原链表的尾节点
        return p;
    }
}

2.递归版本

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //递归终止条件:当前节点为空或已经是最后一个节点
        if(head == null || head.next == null)return head;
        //递归反转后续链表
        ListNode newHead = reverseList(head.next);
        //将当前节点的下一个节点的next指向当前节点
        head.next.next = head;
        //断开原有指向
        head.next = null;
        return newHead;
    }
}
posted @ 2025-05-15 10:16  回忆、少年  阅读(11)  评论(0)    收藏  举报