leetcode刷题笔记二十五 K 个一组翻转链表 Scala版本

leetcode刷题笔记二十五 K 个一组翻转链表 Scala版本

源地址:25. K 个一组翻转链表

问题描述:

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明:

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

代码补充:

//拿到这个题目的时候,第一想法是通过栈对K个元素进行管理,将前K个元
//素入栈,然后依次弹出重构链表
//查阅相关资料,发现更好的方法主要是递归法,相对于使用栈管理,对空
//间和时间有了一些提升
//将问题进行分解,链表分解出K长度、三指针分解后的链表倒叙和对之后的链表进行重复操作
/**
 * Definition for singly-linked list.
 * class ListNode(var _x: Int = 0) {
 *   var next: ListNode = null
 *   var x: Int = _x
 * }
 */
object Solution {
    def reverseKGroup(head: ListNode, k: Int): ListNode = {
    		//当链表为空或只有一个节点或者k=1,直接返回
            if(head == null || head.next == null || k == 1) return head
			
			//设立a b指针用来获取K长度的指针
            var a = head
            var b = head

			//将b指针向右移动K次,如果不到K次直接返回
            for( i <- 0 until k ){
                if (b == null) return head
                b = b.next
            }

			//对本次获取的K长度的链表进行倒叙
            val ans = reverse(a,b)
            //此时a为最右节点,对其后链表进行处理
            a.next = reverseKGroup(b,k)
            return ans
    }
	
    //通过三指针进行两个节点间倒序,通过循环多次执行达到链表倒叙
    def reverse(a:ListNode, b:ListNode):ListNode = {
        var pre:ListNode = null
        var cur = a
        var nxt = a

        while (cur != b) {
            nxt = cur.next
            cur.next = pre
            pre = cur
            cur = nxt
        } 
        return pre
    }
}

补充:

posted @ 2020-04-26 23:33  ganshuoos  阅读(136)  评论(0编辑  收藏  举报