题目
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
解题思路
创建虚拟指针,头插法插入节点。
时间复杂度O(n),空间复杂度O(1)。
代码
public ListNode reverseList(ListNode head) {
//链表为空或只有一个节点,无需反转,直接返回
if(head == null || head.next == null){
return head;
}
//新建虚拟节点,初始化其next为头节点head
ListNode virtual = new ListNode(0);
virtual.next = head;
//新建node,初始化为第二个节点
ListNode node = head.next;
//pre用来标记为node的下一个节点
ListNode pre;
//断链;反转链表后,原来的头节点变为尾节点,故其next为null
head.next = null;
//头插法,遍历链表,每次都在virtual节点和其下一个节点之间插入遍历的当前节点
while (node != null) {
pre = node.next;
node.next = virtual.next;//
virtual.next = node;
node = pre;
}
return virtual.next;
}
以上是我关于本题的思路和代码描述,如有不对不妥的地方,虚心接受大家的批评指正,希望大家共同进步!