题干
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
思路1
利用栈“先入后出”的特点,将原链表所有数值存入栈,在出栈依次存入新的链表,返回该链表。
/**
* 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) {
//建立一个栈,建立一个新的链表,一个辅助指针
Stack<Integer> stack=new Stack<>();
ListNode list2=new ListNode();
ListNode temp=list2;
while(head!=null){
stack.push(head.val);
head=head.next;
}
while(!stack.isEmpty()){
temp.next=new ListNode(stack.pop());
temp=temp.next;
}
return list2.next;
}
}
时间复杂度,两次单层遍历O(n) 空间复杂度O(n)
提交时间 | 提交结果 | 运行时间 | 内存消耗 | 语言 |
---|---|---|---|---|
几秒前 | 通过 | 2 ms | 38.3 MB | Java |
思路2
交换指针位置
/**
* 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 prev=null;
ListNode cur=head;
while(cur!=null){
ListNode next=cur.next;
cur.next=prev;
prev=cur;
cur=next;
}
return prev;
}
}
参照的这个讲解
3个指针,prev curr next 分别记录 head前、 head、 head后,遍历一次,首先记录head后位置(next),然后head(cur)指向head前(prev),这样完成指向的翻转。
迭代时,head前(prev)指向head(cur),head(cur)指向head后(next,先前记录过)。
提交时间 | 提交结果 | 运行时间 | 内存消耗 | 语言 |
---|---|---|---|---|
几秒前 | 通过 | 0 ms | 38.3 MB | Java |
思路3
/**
* 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) {
if(head==null||head.next==null){
return head;
}
ListNode p=reverseList(head.next);
head.next.next=head;
head.next=null;
return p;
}
}
提交时间 | 提交结果 | 运行时间 | 内存消耗 | 语言 |
---|---|---|---|---|
几秒前 | 通过 | 0 ms | 38.6 MB | Java |