题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思路一(迭代版)
假设存在链表1->2->3->4,最直白的想法就是1<-2然后2<-3,3<-4。
实际的思路也是如此,我们只需要一个维护pre和cur节点,pre用来保存上一个节点,cur保存我们当前遍历到的节点,然后cur.next=pre不久翻转了吗,但这个时候你要记得提前保存cur.next的值,不然我们在执行cur.next=pre后就会失去下一个节点的地址。
思路一代码
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
//迭代反转链表
public ListNode reverseList(ListNode head) {
ListNode pre=null;
ListNode cur=head;
ListNode temp;
while(cur!=null){
temp=cur.next;
cur.next=pre;
pre=cur;
cur=temp;
}
return pre;
}
思路二(递归版)
说实话,递归版我不好解释,直接上代码,拿着一个链表走一遍程序你就理解了。
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
//递归反转链表
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;
}
再附带一份调试用的函数,通过数组生成链表:
// 传入数组,生成链表
public ListNode createList(int[] num) {
if (num.length == 0)
return null;
ListNode head = new ListNode(num[0]);
ListNode res = head;
for (int i = 1; i < num.length; i++) {
head.next = new ListNode(num[i]);
head = head.next;
}
return res;
}