给定一个链表,旋转链表,将链表每一个节点向右移动 k 个位置,其中 k 是非负数。如图:算法
试题连接:https://leetcode-cn.com/problems/rotate-list/指针
为了完成该算法,在进行代码编写时先进行了数学分析,下面照片是数学分析的草稿,图可能有些丑。code
下面解释下该图:blog
public static ListNode rotateRight(ListNode head, int k) { if(head == null) return null; //1,须要知道链表的长度 ListNode pCurrent = head; int count = 1; while(pCurrent.next != null) { //计数 count++; //向下 pCurrent = pCurrent.next; } //循环结束后,指向的是最后一个结点,对接成循环链表 // System.out.println(count); pCurrent.next = head; //指向头,循环链表 pCurrent = pCurrent.next; //计算有效循环 int total = k % count; //计算顺转次数 total = count - total; // System.out.println(total); for(int i = 1;i < total;i++) { pCurrent = pCurrent.next; } //保存下一个结点 ListNode saveNode = pCurrent.next; pCurrent.next = null; return saveNode; }
算法效果:内存
算法分析,时间上还行,可是空间上消耗较大。leetcode
struct ListNode* rotateRight(struct ListNode* head, int k){ if(head == NULL) return NULL; //1,须要知道链表的长度 struct ListNode* pCurrent = head; int count = 1; while(pCurrent->next != NULL) { //计数 count++; //向下 pCurrent = pCurrent->next; } //循环结束后,指向的是最后一个结点,对接成循环链表 // System.out.println(count); pCurrent->next = head; //指向头,循环链表 pCurrent = pCurrent->next; //计算有效循环 int total = k % count; //计算顺转次数 total = count - total; // System.out.println(total); for(int i = 1;i < total;i++) { pCurrent = pCurrent->next; } //保存下一个结点 struct ListNode* saveNode = pCurrent->next; pCurrent->next = NULL; return saveNode; }
算法效果:get
算法分析:根据C语言的提交结果可知,在时间和内存消耗上都较为通常数学