反转链表
题目描述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
思路一:反转链表我们可不可以看作是将数据先放入某个容器,所有数据都放入容器后,再一一拿出来并连接即可。这个特点就是先进后出。很容易就想到这个容器就是栈(stack)
代码:
/**
* 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<ListNode> stack=new Stack<>();
while(head!=null){
stack.push(head);
head=head.next;
}
if(stack.empty()){
return null;
}
ListNode node =stack.pop();
ListNode newLink=node;
while(!stack.empty()){
ListNode stackLink=stack.pop();
node.next=stackLink;
//移动指针
node=node.next;
}
//链表最后一个元素一定要定为null,否则就会构成闭环
node.next=null;
//这里为什么不用node直接返回,而是赋值一份node返回
//原因是此时node指针是最后一个
//也就是返回结果是链表里的最后一个,大家可以自己去自定义测试下
//链表这一块不好理解,大家测试后就会对整个链表的基本结构都很清晰了
return newLink;
}
}
思路二:双链表
创建新链表,把原链表节点拿下来连接到新链表的节点
class Solution {
public ListNode reverseList(ListNode head) {
ListNode newLink=null;
while(head!=null){
//保存下一个节点
ListNode temp=head.next;
//将head节点连接到newLink
head.next=newLink;
//更新新链表
newLink=head;
//移动head节点到下一个节点
head=temp;
}
return newLink;
}
}