AcWing33:反转链表
Posted 劭兮劭兮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing33:反转链表相关的知识,希望对你有一定的参考价值。
我们生在红旗下,
长在春风里,
目光所至皆为华夏,
五星红旗皆为信仰。
人民有信仰,民族有希望,国家有力量。
问题
原题链接:反转链表
解决办法
迭代版本
翻转即将所有节点的next指针指向前驱节点
如图所示:
注意:单链表在改变current.next指向时,需要先将current.next保存起来,否则会出现改变指向后,找不到原来的元素的情况。
递归版本
递归,首先我们需要考虑递归函数要做什么问题;
reverseList(node) 函数需要将链表翻转;
怎样翻转呢?
- 当单链表为空或者只有一个元素时,无需翻转,只需 return head; 既可
- 当单链表有两个元素结点时,
head.next.next = head;
head.next = null; - 但单链表有三个元素结点时,
当链表中有三个元素结点时,
首先调用
reverseList(1){
reverseList(2){
reverseList(3){
return 3;
}
2.next.next = 2; //3指向2
2.next = null; // 3->2->null, 1->2
return 3;
}
1.next.next = 1; //2->1;
1.next = null; 3->2->1->null
return 3;
}
JAVA代码实现
迭代版本
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) {
// 无需翻转
return head;
}
// 辅助遍历单链表
ListNode current = head;
ListNode previous = null;
while(current != null) {
// current指针改变后,current.next会丢失,所以需要先保存起来
ListNode nextElement = current.next;
// 将current的指针改变
current.next = previous;
// current指针和previous都后移
previous = current;
current = nextElement;
}
return previous;
}
}
递归版本
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode temp = reverseList(head.next);
head.next.next = head;
head.next = null;
return temp;
}
}
小记:
原题链接:反转链表
以上是关于AcWing33:反转链表的主要内容,如果未能解决你的问题,请参考以下文章