题目:
反转单链表
Reverse a singly linked list.
Input: 1->2->3->4->5->NULL Output: 5->4->3->2->1->NULL
思路:
使用迭代来实现
每次将原链表的头节点加入到另一个链表的头部中
如1 2 3 4 5 null,先将1加入到新链表中,得到新链表1 null,原链表2 3 4 5 null;再加入2,得到新链表2 1 null,原链表3 4 5 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){
ListNode re = null;
while(head!=null) {
re = rev(re, head);
head = head.next;
}
return re;
}
public ListNode rev(ListNode reHead, ListNode head) {
ListNode temp = head;
ListNode re = new ListNode(temp.val);
re.next = reHead;
return re;
}
}
跟进:链表可以迭代或递归地反转。你能两者都实现吗?
Follow up: A linked list can be reversed either iteratively or recursively. Could you implement both?
迭代的方法同上
递归的方法——在上面的代码上进行了一些修改,用函数调用自己
(rev函数中加入判断是否为空是因为原函数中把判断删除了,如果原函数中有判空条件,则rev函数中可删去)
class Solution {
public ListNode reverseList(ListNode head){
return rev(null, head);
}
public ListNode rev(ListNode reHead, ListNode head) {
if(head!=null){
ListNode temp = head;
ListNode re = new ListNode(temp.val);
re.next = reHead;
if(head.next!=null) {
re = rev(re, head.next);
}
return re;
}else{
return null;
}
}
}