题目描述:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
申请两个指针分别为previous和current
current:表示当前链表的位置(初始化指向头指针)
previous:表示前一位置(初始化指向空)
链表反转时,当前节点指向前一节点
即:current.next = previous;
(值得注意的是,当该步骤执行后,当前节点的下一节点会丢失
解决方法:在该步骤之前再申请一节点(temp)保存当前节点的下一节点位置。
即:temp=current.next;)
后 当前指针和前一指针向前移动
previous = current;
current = temp;
完整代码为:
ListNode pre = null;
ListNode current = head;
ListNode temp = null;
while (current != null) {
//保存后一个结点的位置
temp = current.next;
//将当前节点指向上一节点
current.next = pre;
//当前和前一位置向后移动
pre = current;
current = temp;
}
return pre;
递归问题:1:一个问题可以分为若干个子问题
2:某些子问题是原子的,另外一些子问题与原问题的逻辑相同
典型的有汉诺塔问题,求阶乘等
**注:**然而对于一个问题,能用循环就不用递归(前提是循环结构实现起来比较简单)
递归问题的本质实质就是对栈的使用。
递归结构:
public Status digui(参数0,1,2…){
if(终止条件){
return;
}
逻辑处理(原子,可以存在也可以不存在)
//递归调用
digui(参数0,1,2…);
逻辑处理(原子,可以存在也可以不存在)
}
对于本题递归时从链表的末尾进行翻转,依次向前
代码实现
public ListNode reverseList(ListNode head) {
//终止条件当前为空或者下一节点为空
if (head == null || head.next == null)
return head;
//递归调用,找到链表末尾
ListNode current = reverseList(head.next);
//对节点进行翻转
ListNode temp = head.next;
temp.next = head;
//此时head表示链表的最后一个节点,应指向null
head.next = null;
return current;
}
若有相同请联系我更改