题目描述
输入一个链表,反转链表后,输出新链表的表头
示例
输入:{1,2,3}
返回值:{3,2,1}
算法思路
迭代
- 新建一个表头
- 遍历链表,每遍历一个元素,删除它,并使用头插入把这个元素插入到新的表头
- 直到链表结束
递归
让系统帮我们压栈
递归反转链表一部分
代码实现
迭代实现
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode ReverseList(ListNode head) {
//新的链表头
ListNode newHead = null;
//移动指针p
ListNode p = head;
//临时指针
ListNode temp = null;
while(p!=null){
//把下一个结点的值存储起来,别弄掉了
temp = p.next;
//头插法
p.next = newHead;
newHead = p;
p = temp;
}
return newHead;
}
}
递归实现
ListNode reverse(ListNode head) {
if (head.next == null) return head;
ListNode last = reverse(head.next);
head.next.next = head;
head.next = null;
return last;
}