一、题目描述
定义一个函数,输入链表的头结点,反转该链表并输出反转后链表的头结点
二、题目分析
方法一:非递归
- 需要3个指针:
- 指向当前遍历的节点
- 指向前一节点
- 指向后一节点
方法二:递归
易出错之处:
- 链表头指针为null 或链表只有一个节点
- 反转后链表出现断裂
- 反转后的头结点不是原始链表的尾结点
三、代码实现
方法一:非递归
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode curNode = head; //指向当前节点的指针
ListNode preNode = null; //指向前一个节点的指针
ListNode reversedHead = null; //反转后链表的头结点
//遍历每个节点,改指针指向
while(curNode != null){
ListNode nextNode = curNode.next;//指向后一个节点的指针
//反转链表的头结点即为原链表的尾结点(下一节点为空)
if(nextNode == null){
reversedHead = curNode;
}
//改变当前节点的指向,指向前一节点
curNode.next = preNode;
//移动前一节点指针到当前节点
preNode = curNode;
//移动当前节点指针到下一节点
curNode = nextNode;
}
//反转链表的节点
return reversedHead;
}
}
方法二:递归
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
/**
*递归
*/
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;
}
}