反转链表
题目描述:
反转一个单链表。
这道题的难点在于熟练运用迭代和递归。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思路一:迭代
1->2->3->4->5
1<-2<-3<-4<-5
要完成这种变化我们观察,1指向的元素指向它自己
指向的意思就是next指针
翻译成代码语言就是 节点 p.next.next = p
那我们的工作就是对每一个节点进行next指针的修改
但是这是单链表想要指向前一个节点,我们要自己把前一个节点存起来
修改完next指针我们原来指向的后面的节点就没啦,所以还要先保存一下。
框架就是:
一、设置当前要进行处理的节点(从头到尾进行循环)
二、保存当前节点的前一个节点
三、保存当前节点的下一个节点
四、修改当前节点的next指针
五、处理完成进行下一个节点(两个善后工作:更新前一个节点和当前节点)
代码:
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
思路二:递归
递归的重要思路就是假装除了当前节点, 后面的节点都已经处理完了
即使实际上我们并没有处理,我们也把后面的都塞给处理函数
也就是相当于我们只处理一个链表的头结点,假设除了头节点都处理完了
那对头节点我们只需要进行三个操作:
一、假设后面的已经排好了(排好之后的头结点是原来的最后一个,用p来存储)
ListNode p = reverseList(head.next);
二、让后面已经反转完成的链表指向它
head.next.next = head;
三 、修改他的next指针,让他指向空
head.next = null;
四、现在反转好的链表就是以p为头节点的链表了
return p;
代码:
class Solution {
public ListNode reverseList(ListNode head) {
//递归
if(head == null || head.next == null)
return head;
ListNode p = reverseList(head.next);
head.next.next = head;
head.next = null;
return p;
}
}