例如:输入1->2->3->4->5
输出:5->4->3->2->1
两种方法:1、迭代 2、递归
要注意的一点是我们在将结点“ 1”指向null之前先要定义一个变量来保存下一个元素结点进行(我们通过链表只能获得链表指向的下一个元素),否则我们将无法通过结点“1”找到其他元素
这样就完成了对第一个元素的反转
这是对第二个元素进行反转的流程图,我们需要将第二个结点指向第一个节点,我们得先设置一个变量“prev”来保存前一个结点
第一种方法:迭代:
package Al;
public class Leetcode {
static class ListNode{
int val;
ListNode next;
public ListNode(int val,ListNode next){
this.val=val;
this.next=next;
}
}
public static ListNode iterate(ListNode head){
ListNode prev=null,next;//分别是上一个变量和,下一个变量
ListNode curr=head;//循环到哪个变量
while(curr!=null){
next=curr.next;//保存下一个结点
curr.next=prev;//赋值
prev=curr;
curr=next;
}
return prev;//返回头结点
}
public static ListNode recursion(ListNode head){
return null;
}
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);
ListNode prev=iterate(node1);
System.out.println(prev);
}
}
第二种方法(递归):
package Al;
public class Leetcode {
static class ListNode{
int val;
ListNode next;
public ListNode(int val,ListNode next){
this.val=val;
this.next=next;
}
}
public static ListNode iterate(ListNode head){
ListNode prev=null,next;//分别是上一个变量和,下一个变量
ListNode 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){//head 为空说明只有一个结点,head.next=null说明已经到最后一个结点,下一步:返回最后一个元素
return head;//返回第五个元素
}
//recursion(head.next);//到第五个结点head.next=null
ListNode new_head=recursion(head.next);
head.next.next=head;//
head.next=null;
return new_head;
}
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);
ListNode prev=recursion(node1);
System.out.println(prev);
}
}