给定一个链表的头节点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;
}
}