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:反转链表的主要内容,如果未能解决你的问题,请参考以下文章

AcWing33:反转链表

C语言反转单向链表的代码

LeetCode 1418. 点菜展示表 / NC103 反转字符串 / NC33 合并有序链表 / NC61两数之和

AcWing3642:链表合并

AcWing3642:链表合并

AcWing3642:链表合并