下面是一个在gfg中反转双链表的程序。
当我尝试提交时,我得到以下错误
您的程序花费的时间超出预期。超过时间限制预期时限0.00秒
有人能告诉我如何减少程序的时间吗?
代码
public static Node reverseDLL(Node head)
{
Node p,cur;
p=head;
cur=head.next;
while(cur!=null)
{
if(cur.next==null)
{
p.next=cur.next;
cur.next=head;
head.prev=cur;
head=cur;
break;
}
p.next=cur.next;
cur.next.prev=p;
cur.next=head;
head.prev=cur;
head=cur;
cur=p.next;
}
return head;
}
您的代码不正确:
未正确设置(原始(尾部节点的prev
成员。它不是在if
块中设置的,而是在上一次迭代中,它通过cur.next.prev=p
获得值,即将其设置为(原始(头节点。这在数据结构中创建了一个无限循环。最终,prev
链路中没有一个是null
。测试框架可能一直在循环地跟踪prev
链接,直到超时为止。
此外,该函数假定head
不是null
。这可能无法保证。
还有太多的作业正在进行。使用双链表非常简单:只需交换每个节点中next
和prev
的值:
public static Node reverseDLL(Node head)
{
if (head == null) {
return null;
}
Node next = head.next;
while (next != null) {
head.next = head.prev;
head.prev = next;
head = next;
next = head.next;
}
head.next = head.prev;
head.prev = null;
return head;
}
这是O(N(时间的经典解决方案,所以我想这项任务的时间约束需要为O(1(求解。查看此线程:https://www.google.com/url?sa=t&source=web&rct=j&url=https://discuss.codechef.com/t/reverse-a-doubly-linked-list-in-o-1/72850&ved=2ahUKEwjipdrQw_T1AhVYLTQIHahIDx8QFnoECBQQAQ&usg=AOvVaw1c0BDUOM0suEK7I4B9pQs