0
点赞
收藏
分享

微信扫一扫

《剑指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)过程:

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

(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)过程:

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

(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)过程:

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

(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;
}



举报

相关推荐

0 条评论