题目介绍
给我们一个链表,将这个链表的反转过来。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
题解模板
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
}
}
解题思路
递归解法
通过题解模板我们知道,传入的是一个链表首节点,返回的是反转链表后新的链表的首节点,并将其中的链表的顺序反转过来。
链表一开始的状态如下,head指针指向首节点。
我们可以这样思考,假如将head的下一个节点作为方法的参数传入,方法执行完,结果是将head.next作为首节点的的链表反转过来,如下图。
这时将head为首节点的链表反转的问题就转化了将head节点加入到以head.next为首节点的链表中。这时我们只需要将head作为val为2的节点的next即可,并将head的next置为null
。那么怎么找到val为2的节点呢,通过上图可以发现head.next就是val为2的节点。
代码:
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;
}
迭代解法
我们假设反转后的链表由newhead指向,那么首先我们将newhead置为null,那么我们只需将原来链表的每个节点一次遍历,并使用头插法将每个节点插入到newhead中即可,返回的newhead就是反转后的链表
代码:
public ListNode reverseList(ListNode head) {
ListNode newHead = null;
while(head != null){
ListNode tmp = head.next;
head.next = newHead;
newHead = head;
head = tmp;
}
return newHead;
}
总结
由于链表的数据结构的原因,所以链表的相关的题目非常适合递归和迭代的算法来思考,所以再遇到链表的相关题目,我们第一时间就要尝试用递归或迭代的方法能否解决。