借助栈也可以
可以采用头插法
迭代法
双指针
:reverseTop:反转链表的首部
,nonReverseTop:尚未反转链表的首部
;不断将两个指针后移动,更新两个指针的指向,即可
//采用双指针:迭代
public ListNode reverseList1(ListNode head){
//已经反转链表的首部
ListNode reverseTop = head;
//尚未反转链表的首部
ListNode nonReverseTop = head.next;
reverseTop.next=null;
while(nonReverseTop!=null){
//保存尚未反转节点的下一个节点方便后面的操作
ListNode temp = nonReverseTop.next;
//尚未反转的首部指向已经反转的首部
nonReverseTop.next=reverseTop;
//一反转的首部进行变换
reverseTop = nonReverseTop;
//更新尚未反转链表的首部
nonReverseTop=temp;
}
//返回反转链表的首部
return reverseTop;
}
递归法
/**
* 翻转链表
* @param head
* @return
*/
public ListNode reverseList2(ListNode head){
if(head==null) return null;
if(head.next==null) return head;
ListNode temp = reverseList2(head.next);
head.next.next=head;
head.next=null;
return temp;
}