注意先看懂非递归方法再看递归,不然会很懵
ListNode类:
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; }
}
}
非递归解法:
定义pre和temp,pre初始化为null,temp初始化为head的后继结点(用于临时保存head.next),先将head.next指向pre,然后pre、head、temp整体向后移动,即pre指向head,head指向temp,temp指向head.next,循环到temp指向null的时候结束
附上代码:
public ListNode reverse(ListNode head){
ListNode pre = null,temp=null;
while(temp!=null) {
temp = head.next;
head.next = pre;
pre = head;
head = temp;
}
return head;
}
递归解法:
递归的思路和非递归的一样,每个结点名字都和上面非递归的对应这样容易看懂
代码:
public ListNode reverse(ListNode head,ListNode pre){
if(head==null) return pre;
ListNode temp = head.next;
head.next= pre;
reverse(temp,head);
return pre;
}
传入调用这个函数的时候这样传参 reverse(head,null),因为head初始就是链表的表头,pre初始是null。temp设为head的后继结点,然后让head.next指向pre,到这里为第一步操作,接下来递归来进行该操作,即reverse()这里的参数是temp,head,这样才可以实现pre、head、temp整体向后移动一个结点,这样整体思路就和上面非递归的一样了