给定一个链表的头节点head反转链表
方法一:循环
1.定义三个指针:
pre指针:刚开始指向空 pre=null
cur指针:刚开始指向head节点 cur=head
temp指针:保存cur指针指向节点的下一个节点
2. 不断循环改变相邻两个节点的指针,直到cur==null
temp=cur.next
cur.next=pre
pre=cur
cur=temp
新建一个temp节点的原因在于:改变cur.next=pre 指向时,防止节点2找不到;
代码:
class Solution {public ListNode reverseList(ListNode head) {ListNode pre = null;ListNode cur = head;ListNode temp = null;while (cur != null) {temp = cur.next;// 保存下一个节点cur.next = pre;pre = cur;cur = temp;}return prev;}
}
方法二:递归
1.确定递归函数的参数: ListNode head
2.确定函数的返回值:只需要返回最后一个节点即可
3.确定递归结束的条件:
如果当head==null ||head.next==null 结束递归
4.确定单层递归的逻辑:
不断递归直到最后 一个节点,在回溯的过程中改变指针方向实现链表反转
head.next.next=head
head.next=null
举例:
class Solution {public ListNode reverseList(ListNode head) {/**递归反转链表:关键在于: 递--找到链表的最后一个结点归:改变指针的方向*///递归结束的条件;if(head==null||head.next==null){return head;}ListNode last= reverseList(head.next);//改变指针方向;head.next.next=head;head.next=null;return last;}
}