链表反转,就是链表原来是1->2->3->4->5,经过反转处理过后变成5->4->3->2->1
处理链表反转,有两种方式,一个是建立虚拟头结点,一个是直接操作链表反转。
1. 建立虚拟头结点
这是执行的流程
最核心的两行就是
cur.next = ans.next; ans.next = cur;
直接想我要让她反转,我现在设立了虚拟头结点,那我就要让新加进这个反转链表的结点的next为我反转链表中ans的next,再让ans的next设为当前结点,也就是我刚才处理的结点。
public static ListNode reverseList(ListNode head) {
ListNode ans = new ListNode(-1);
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = ans.next;
ans.next = cur;
cur = next;
}
return ans.next;
}
这里我对于代码的理解是刚开始设立了ans,但是还没有将ans.next设为第一个结点1,是在第一次循环的时候做的,cur刚开始是原链表的1,循环中,
将cur.next也就是2先设立为next,让ans.next(null)给到cur.next,这里做的是让原链表头结点1的next为null,因为在反转之后,1作为链表的尾结点,next为null。
然后让cur(1)给到ans.next,就是让ans和1建立起了关联。
然后让next也就是原链表的头结点1的下一个结点,给到cur,在处理下一个结点。这样就实现了链表反转。
2. 直接在链表操作
这种也是要会的
文章来源:https://www.toymoban.com/news/detail-642381.html
文章来源地址https://www.toymoban.com/news/detail-642381.html
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
到了这里,关于算法通关村第二关——链表反转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!