题目:《剑指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;
}