递归思想进行链表的反转
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode ReverseList (ListNode head) {
// write code here
//如果头节点为空或者头结点没有下一个连接的节点,链表反转为自身
//这块的条件也是递归的出口
if (head == null || head.next == null) {
return head;
}
/**
* 递归开始为检测节点是否为空,遍历到最后一个节点,cur指向最后一个节点
* 返回调用他的上一个节点,就为head
*/
ListNode cur = ReverseList(head.next);
//指向的就是最后一个节点的next域,将上一个节点的指向置为空
head.next.next = head;
head.next = null;
//cur则为反转后的链表的头节点
return cur;
}
}
双指针进行链表的反转
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode ReverseList (ListNode head) {
// write code here
//如果头节点为空或者头结点没有下一个连接的节点,链表反转为自身
if (head == null || head.next == null) {
return head;
}
//创建一个空指针和一个指向头节点的指针
ListNode pre = null;
ListNode cur = head;
//如果cur不为空,把整个链表遍历完
while (cur != null) {
//创建一个指针用来记录cur的下一个节点
ListNode tmp = cur.next;
/**
* 这个时候,cur指向的是头节点,先让头结点的next域为空
*/
cur.next = pre;
//让指针pre指向cur
pre = cur;
//因为tmp记录了cur的下一个节点,cur就不会丢失下一个节点的地址
cur = tmp;
}
/**
* 直到链表反转完成,cur最终指向为null,因为tmp记录了cur.next位置
*/
return pre;
}
}