前言
今天遇到一道很有意思的链表题,这道题不难,没有算法相关的逻辑,考的就是coding能力以及对边界的把控能力。其实一开始笔者是想到了求链表长度以及用尾节点,只不过后来换了种方法,那种方法笔者设了三个变量,能实现但是太繁琐,指针指来指去人都被整懵了。下文的代码实现采用了更优化的一种方式。
leetcode_61题目:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
解题思路
- 首先需要求出整个链表的长度n,将节点移动k个位置实际上类似循环链表的节点移动,由于k可能很大,所以令k = k%n。
- 找到尾节点tail,并令tail = head,这样构成了一个环。
- 接下来需要找到新的头结点,也就是第前n-k个节点p的下一节点,令head = p.next。
- 最后令p.next =null。
如果k=1的话,最后应该是这个样子如图:
代码实现
public ListNode rotateRight(ListNode head, int k) {
if (head == null || k == 0) {
return head;
}
int n = 0;//链表的长度
ListNode tail = null;//尾节点
for (ListNode p = head; p != null; p = p.next) {
tail = p;
n++;
}
k %= n;
ListNode p = head;
for (int i = 0; i < n - k - 1; i++) {//找到链表的第n-k个节点
p = p.next;
}
tail.next = head;
head = p.next;
p.next = null;
return head;
}