0
点赞
收藏
分享

微信扫一扫

反转链表206

有点d伤 2022-01-17 阅读 67

题目信息

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
 

示例 1:


输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:


输入:head = [1,2]
输出:[2,1]
示例 3:

输入:head = []
输出:[]

思路分析,通过图可以知道,要使这个链表反转,只需要让当前节点的next指向前一个节点就能实现链表的反转,于是就可以通过双指针解决这个问题,让指针pre 和 cur 移动直到cur ==null时,pre所指向的节点成为新链表的新的头节点,反转结束.

1.通过使用双指针的代码如下:

 //双指针解决
class Solution {
    public ListNode reverseList(ListNode head) {
        //定义temp变量存放 cur.next
        ListNode temp;
        ListNode pre = null;
        ListNode cur = head;

        while(cur!=null){
            temp = cur.next;
            cur.next = pre;

            //更新指针pre和cur
           pre =cur;
           cur = temp;
        }
        return pre;
    }
}

2.当然也可以使用递归解决反转链表,实际操作和双指针方法大致一样,理解了双指针方法,递归就更好理解了,代码实现如下:

class Solution{
    public ListNode reverseList(ListNode head){
        return reverse(null,head);
    }
    //写一个方法来进行链表反转
    public ListNode reverse(ListNode pre,ListNode cur){
        //如果cur指针为null,说明链表反转完成
        if(cur == null){
            return pre;
        }
        ListNode temp = null;
        temp = cur.next;
        cur.next = pre;

        //通过递归更新指针pre和cur
        return reverse(cur,temp);
    }
}


 

举报

相关推荐

0 条评论