题目示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
public class ListNode { //链表结构如下
int val;
ListNode next;
ListNode(int x) { val = x; }
}
``
解法一:双链表法 解决
将已知链表定义为链表1,目标链表定义为链表2,通过将链表1的头结点依次取下,放在链表2头结点之前,即可完成替换。
public ListNode reverseList(ListNode head) {
//双链表法 解决
ListNode p = head; //链表1
ListNode q = null; //链表2
while (p != null) {
ListNode temp = p.next;
p.next = q; //把表2的头结点赋值给表1链接在表一后面
q = p; //表二头结点变成q结点
p = temp; //表一的头结点变成原先q的next
}
return q;
}
解法二:递归法
根据解法一的思想,修改代码
``
public ListNode reverseList2(ListNode head) {
//递归法 解决
ListNode p = head; //链表1
ListNode q = null; //链表2
return doReverseList2(p,q);
}
public ListNode doReverseList2(ListNode p,ListNode q) {
if (p!=null){
ListNode temp = p.next;
p.next = q; //把表2的头结点赋值给表1链接在表一后面
q = p; //表二头结点变成q结点
p = temp; //表一的头结点变成原先q的next
return doReverseList2(p,q);
}
else return q;
}