反转链表

84 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

题目

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

示例:

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

限制:

0 <= 节点个数 <= 5000

题目分析

这道题同样考察对链表的理解,链表我们都已经很熟悉了,那么把链表反转输出,我们使用双指针的方法,cur指针指向当前节点,tmp暂存指针指向的下一个节点,然后修改cur指向的节点,cur的下一个指针改为指向pre指针指向的节点,这样遍历完之后从头到尾的链表就改成从尾到头的链表了,从而实现链表的反转。

代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
//24
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode cur = head, pre = null;
        while (cur!=null) {
            ListNode tmp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = tmp;
        }
        return pre;
    }
}

这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉链表的功能和特点。

这是这道题的双链表的实现方式,其实这道题还有不同的解法,例如,使用递归的方法,递归终止的条件是到了尾结点,然后从尾结点回溯的时候,修改当前节点的next指针,指向前一个节点,代码实现具体是

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode cur = head, pre = null;
        while(cur != null) {
            ListNode tmp = cur.next; 
            cur.next = pre;          
            pre = cur;               
            cur = tmp;               
        }
        return pre;
    }
}

当然能用递归的方法就能用栈,用栈的话思路就是遍历节点一个一个入栈,然后出栈组成的新链表就是反转后的链表了。