构建一个链表
public class ListNode{
int val;
ListNode next;
public static void main(String[] args){
ListNode node5 = new ListNode(5,null);
ListNode node4 = new ListNode(4,node5);
ListNode node3 = new ListNode(3,node4);
ListNode node2 = new ListNode(2,node3);
ListNode node1 = new ListNode(1,node2);
}
}
迭代法反转链表
public static ListNode iterate(ListNode head){
/*
prev默认为null,因为head传进来后,思路为把入口的方向变成出口的方向,第一个(头结点)会变成最后一个结点(尾结点)该算法实际上的操作是两两迭代把方向反转(也就是第一个的next是null,第二个的next是第一个),当整个链表迭代完成也代表整个链表已经完成了链表的反转
*/
ListNode prev = null,next,curr;
curr = head;
while(curr != null){
next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
递归法反转链表
public static ListNode recursion(ListNode head){
/*
该算法基于递归算法实现反转链表
开始的if判断用于判断传入的head 如果是null即为空链表,无需反转; 如果head.next是null即代表该链表已经递归到最后一个结点,可以开始反转操作
[ListNode newNode = head.next;] 该表达式是第四次递归里才能进入的,因为第五次的递归作用是return head给newNode
后面的操作对newNode无影响
newNode是新链表的入口结点
[head.next.next = head;] 这行代码作用是将head的下一个的next指回head,用于把方向反转
[head.next = null;] 这行代码实际是属于第一次递归里的,把一开始的头结点的next赋值为null即头结点变为尾结点
[return newNode;] 返回newNode即可获得反转后的链表,入口结点其实为原来的出口结点(尾结点)
*/
if(head == null || head.next == null){
return head;
}
ListNode newNode = head.next;
head.next.next = head;
head.next = null;
return newNode;
}