方法1:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
List<Integer> list = new ArrayList<>();
ListNode p = head;
while(p!=null){
list.add(p.val);
p = p.next;
}
p = new ListNode(-1);
ListNode h = p;
for(int i=list.size()-1 ; i>=0 ; --i){
p.next = new ListNode(list.get(i));
p = p.next;
}
return h.next;
}
}
方法2:原地迭代:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
//原地修改
public ListNode reverseList(ListNode head) {
ListNode p=null, q=head, r=p;
while(q!=null){
r = q.next;
q.next = p;
p = q;
q = r;
}
return p;
}
}
方法3:递归逆转
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
//递归方式逆转链表
ListNode reverse; //存储递归到的尾部节点
public ListNode reverseList(ListNode head) {
if(head == null){
return null;
}
help(head);
return reverse;
}
public ListNode help(ListNode head){
if(head.next == null){
reverse = head;
return head;
} //到达尾部节点时返回
ListNode p = help(head.next); //一直向后递归
p.next = head; //递归到尾部节点时,head后面的一个节点指向head
head.next = null; //并且head不指向后面的节点,防止有环
return head;//返回逆转后的节点位置
}
}