首页 > 编程知识 正文

单链表就地反转,递归反转

时间:2023-05-04 15:51:46 阅读:33523 作者:131

对于订购链表的头节点head,请反转链表,然后返回反转的链表的头节点。

假设您有一个如图所示的链表。 链表在next的内容中只能读取到下一个节点,所以如果想反转链表,需要如下图所示转换next的内容。

可以用一个prve保存当前节点的值,用一个next指向下一个节点。 这样,过渡后将成为一个节点的next将指向两个节点,两个节点将指向null,重复操作即可完成翻转。

/* *定义链接列表. *公共类列表节点{ * intval; * ListNode next; * ListNode () ) listnode(intval ) { this.val=val; }*listnode(intval,ListNode next ) { this.val=val; this.next=next; } * }/class解决方案{ publiclistnodereverselist (listnode head ) { ListNode prev=null,next; ListNode curr=head; 为了确定while循环的边界,必须定义当前位置while(curr )=null}{next=curr.next; curr.next=prev; prev=curr; curr=next; } return prev; }除了该迭代的算法之外,该反演还可以通过对前后两个节点分别将后节点的next指向前节点,并将前节点的next指向空来完成

head.next.next=head; head.next=null; 但是,这种想法存在的问题是,如果从前面开始,第二个节点反转后,就找不到第三个节点了。 那么,是否可以从后面开始,递归地找到最后一个节点和倒数第二个节点,然后逐步前进完成反转

/* *定义链接列表. *公共类列表节点{ * intval; * ListNode next; * ListNode () ) listnode(intval ) { this.val=val; }*listnode(intval,ListNode next ) { this.val=val; this.next=next; } */class solution { publiclistnodereverselist (listnode head ) if ) head==null||head.next==null ) { return head } //我们要找的是倒数第一两个元素,所以递归时需要传递给head.next head.next.next=head; head.next=null; 返回新头; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。