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:反转链表

LeetCode - 92 - 反转链表|| - java - 两种解法 - 细喔~

AcWing85:在O时间删除链表结点

AcWing85:在O时间删除链表结点

剑指Offer链表反转链表

反转链表算法Java实现