《剑指offer》之“翻转单链表”递归、迭代、双指针解题

题目:《剑指offer》第二十四题

https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/

解法:递归算法、迭代算法、使用双指针

开始操作~

首先加一个链表类:

static class ListNode {
    
    
    int val;
    ListNode next;

    ListNode(int x) {
    
    
        val = x;
    }
}

解法一:迭代算法

(1)思想

使链表自身进行变化,使每个节点的next指针不断指向前一个节点,前提是当前的节点不为空。

(2)过程:
在这里插入图片描述
(3)代码:

/**
 * 迭代算法
 *
 * @param head
 * @return
 */
public static ListNode reverseList1(ListNode head) {
    
    
    //初始化声明 pre=null cur=head
    ListNode pre = null, cur = head;
    while (cur != null) {
    
    
        //获取当前链表的next
        ListNode next = cur.next;
        //将pre的值给cur的next节点
        cur.next = pre;
        //将cur赋值类pre
        pre = cur;
        //使cur等于
        cur = next;
    }
    return pre;
}

解法二:递归算法

(1)思想

首先划定一个递归的界限,就是递归停止的条件,然后不断递归调用,使自己的next节点的next节点指向当前节点

(2)过程:
在这里插入图片描述
(3)代码:

/**
 * 递归算法
 *
 * @param head
 * @return
 */
public static ListNode reverseList2(ListNode head) {
    
    
    //验证是否满足可递归条件
    if (head == null || head.next == null) {
    
    
        return head;
    }
    //进行递归
    ListNode newHead = reverseList2(head.next);
    //当前节点的next的next节点等于当前节点
    head.next.next = head;
    //当前节点的下一个节点为null
    head.next = null;
    //返回递归后的新链表
    return newHead;
}

解法三:双指针

(1)思想

每次都让 head下一个结点的 next指向 cur,实现一次局部反转,局部反转完成之后,cur 和 head的 next节点同时 往前移动一个位置,不断循环,直至 cur到达链表的最后一个结点

(2)过程:
在这里插入图片描述
(3)代码:

/**
 * 双指针方法
 *
 * @param head
 * @return
 */
public static ListNode reverseList3(ListNode head) {
    
    
    //声明头结点和当前节点
    ListNode pre = null;
    ListNode cur = head;
    while(head!=null){
    
    
        //进行局部翻转
        head = head.next;
        cur.next = pre;
        pre = cur;
        cur = head;
    }
    return pre;
}

猜你喜欢

转载自blog.csdn.net/Mr_YanMingXin/article/details/119926606