解法一:迭代,遍历链表的时候进行反转
public ListNode reverseList(ListNode head) {
//pre为反转之前的链表遍历时当前节点的上一个节点
//由于要改动当前节点的next指向,需要将原始链表的当前节点的下一个节点存储起来
ListNode pre = null;
ListNode cur = head;
//四步走:存储下一个节点,改cur指向,移动pre,移动cur
while(cur!=null) {
//保存下一个节点
ListNode saveNext = cur.next;
//当前节点指向上一个节点
cur.next = pre;
//pre变成当前节点,也就是下一次遍历的时候的上一个节点
pre = cur;
//当前节点指向下一个节点
cur = saveNext;
}
return pre;
}
提交结果:
解法二:递归方式
//该问题可以分解为n个重复子问题,可以使用递归来解
//要反转n个节点的链表,只需要反转后面n-1个节点,再反转当前节点与后面的那个节点;
//要反转后面n-1个节点的链表,只需要反转后面n-2个节点,再反转当前节点与后面的那个节点;
//设方法ListNode reverseList(ListNode head)可以反正head指向的链表,并且返回反转之后的链表头节点
public ListNode reverseList(ListNode head) {
if(head==null || head.next==null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
提交结果: