反转链表
题目要求
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
迭代法
迭代法这里,我首先出现的问题是,直接用了head指针 ,看似没问题,但是你的头指针呢,head应该的指向null的,使用这个方法会导致head-> <-head.next形成环路。所以应该定义两个指针 pre、cur
while(head.next!=null){
tmp=head.next;
head.next.next=head;
head=tmp;
}
第2个问题,在循环中的选择的时候发生了如下问题(5.4.3.2.1)只返回5
while(cur.next!=null){
。。。。
}
return cur
想明白了,cur.next是在变化的呀,(循环到while的时候 cur.next指针已经往回指了)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
ListNode pre =null;
ListNode cur =head;
if(head==null || head.next==null){
return head;
}
while(cur!=null){
ListNode tmp=cur.next;//是cur.next会发生变化,所以要用tmp暂存
cur.next=pre;
pre=cur;
cur=tmp;
}
return pre;
}
}
递归法
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null|| head.next==null){
return head;
}
// 步骤 1: 先翻转 head 之后的链表
ListNode newhead=reverseList(head.next);
这个是最后的那个节点,而不是head.next那个节点
// 步骤 2: 再把原 node 节点后继结点的后继结点指向 head,head 的后继节点设置为空(防止形成环)
head.next.next=head;
head.next=null;
return newhead;
}
}