- 迭代
- 做法经典双指针,用一个temp指针当临时变量,占住cur.next的坑(占住cur正数的后一项)。
- 让pre成为cur的后一项,把cur的值给pre,把temp的值给cur,这样实现往后移了。
- 最后pre指向最后一个结点而cur指向他下一处,即null。
ListNode pre=null; ListNode cur=head; ListNode temp=null; while(cur!=null) { //因为一会要把cur的下一个节点指向pre,所以先保存原链表的节点值 temp=cur.next; //先确立连接关系 否则Error - Found cycle in the ListNode cur.next=pre; pre=cur; cur=temp; } return pre;
- 递归法
class Solution {
public ListNode reverseList(ListNode head) {
//判断递归结束的条件是当前节点或他的下一个节点为空
if(head==null||head.next==null)
{
return head;
}
//若链表为1->2->3->4->5,那么此时的last节点,即head.next 也就是原链表的最后一个节点,即5
//head.next是第一个节点
ListNode last=reverseList(head.next);
//此时原本的head节点为4,那么接下来要做的就是链表倒置。
//每次只倒置原链表的最后两个节点,也就是倒置后新链表的前两个节点
//4.next==5,4.next.next==5.next,那么我们把5.next赋值为4,这样完成了4->5到5->4的反转
head.next.next=head;
//此时4在链表尾了,新产生的链表还没有定义,要防止它循环,所以先把他后面的节点head.next赋值为null
head.next = null;
//实际上每层调用都返回了last,即最后一个节点
//那么我们发现在这个题里,last一直都是原来链表的尾节点5,原因是递归调用改变的是head,而最后指向的新的链表的链表头还是原来的最后一个节点
return last;
}
}