描述:
Reverse a singly linked list.
A linked list can be reversed either iteratively or recursively. Could you implement both?
分析:
首先定义一个指向当前节点前一节点的指针pre,初值为null,只要当前节点不为空就循环执行下面四步操作,否则直接跳出循环,返回pre指针(因为跳出循环就意味着当前节点为空,那新的头节点就是当前节点的前一节点)
- 备份当前节点的next指针
- 将当前节点的next指针指向前一节点,即赋值为pre
- 将当前节点变成前一节点,即pre=当前节点
- 将下一节点变成当前节点,即当前节点=下一节点
代码:
//定义链表节点
public class ListNode{
int val;
ListNode next;
ListNode(int x) {val = x};
}
- 迭代方法:
public ListNode reverseList(ListNode head) {
ListNode pre = null;//定义一个指向当前节点前一节点的指针pre,初值为null
while(head != null) {
ListNode next = head.next;//备份当前节点的next指针
head.next = pre;//将当前节点的next指针指向前一节点,即赋值为pre
pre = head;//将当前节点变成前一节点,即pre=当前节点
head = next;//将下一节点变成当前节点,即当前节点=下一节点
}
return pre;//返回pre指针(因为跳出循环就意味着当前节点为空,那新的头节点就是当前节点的前一节点)
}
- 递归方法:
public ListNode reverseListRecursively(ListNode head, ListNode pre) {
if(head == null) {//当前节点为空,则直接返回指向前一节点的指针
return pre;
}
ListNode next = head.next;//备份当前节点的next指针
head.next = pre;//将当前节点的next指针指向前一节点
return reverseListRecursively(next, head);//递归调用方法,此时当前节点为原当前节点的下一个节点,而前一节点为原当前节点
}
public ListNode reverseList(ListNode head) {
return reverseListRecursively(head, null);
}