场景
在自己尝试用Java实现一个单链表的时候,遇到了一个经典问题:反转单链表【腾讯面试题】
问题大概就是给你一个单链表,然后将其中的节点反转进行返回
思路
大概思路图解如下:
原地反转,顺序遍历节点;
并且提前存储节点的下一个节点方便遍历
在创建一个新的节点对象来当做新链表的头结点
提前创建新头结点的下一个节点方便进行头插法
图解
在看了原地操作思路之后写了一个空间复杂度O(1),时间复杂度为O(n)的代码
代码
代码如下:
/**
* 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 newnode = new ListNode();//创建新链表的头结点
ListNode newnext = null;//表示新链表的头结点的下一个节点
ListNode cur = head;//存储每一次遍历的节点,初始化为第一个节点
ListNode next = null;//用于表示每一次遍历节点的下一个节点,方便遍历操作
while (true) {
if (cur == null) {//遍历到尾部,退出循环
break;
}
next = cur.next;//提前存储当前节点的下一个节点
newnext = newnode.next;//提前存储新头结点的下一个节点
newnode.next = cur;//将当前节点赋值给新头结点的next,头插法
cur.next = newnext;//将提前记录的newnext赋值给插入节点的next
cur = next;//将提前记录的节点赋值给cur,进行遍历操作
}
return newnode.next;//newnode初始化为null,返回第一个节点
}
}
最后可以根据链表是否包含哨兵对返回值进行调整