1.寻找中间节点
给定一个头节点为 head 的非空单链表,返回链表的中间节点。
如果有两个中间节点,则返回第二个中间节点。
示例:
输入:[1,2,3,4,5]
输出:此列表中的节点 3
Java实现:
public static ListNode middleNode(ListNode head) {
ListNode slow = head, fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
python实现:
def middleNode(self, head):
if head is None:
return None
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
2.寻找倒数第K个元素
题目:输入一个链表,输出该链表中倒数第k个节点
示例:一个链表有
6
个节点,从头节点开始,它们的值依次是1、2、3、4、5、6
。这个链表的倒数第3
个节点是值为4
的节点。给定一个链表: 1->2->3->4->5, 和 k = 2. 返回链表 4->5.
解题思路:快慢指针
Java实现:
public static ListNode getKthFromEnd(ListNode head, int k) {
ListNode fast = head;
ListNode slow = head;
while (fast != null && k > 0) {
fast = fast.next;
k--;
}
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
Python实现:
def getKthFromEnd(self, head, k):
former, latter = head, head
for _ in range(k):
if not former: return
former = former.next
while former:
former, latter = former.next, latter.next
return latter
3.旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL
思路:使用双指针找到倒数K的位置,然后将倒数K位置左右两边的链表重新连接,从而得到结果。
主要考虑:当K大于链表长度的情况。针对这种情况需要获取链表长度,然后使用k=k%len来判断,如果k=0,则不用旋转,直接返回头结点
Java实现
public static ListNode rotateRight(ListNode head, int k) {
if (head == null || k == 0) {
return head;
}
ListNode temp = head;
ListNode fast = head;
ListNode slow = head;
int len = 0;
//计算链表长度
while (head != null) {
head = head.next;
len++;
}
if (k % len == 0) {
return temp;
}
//K可能大于链表长度,比如len=5,k=7和2,效果是一样的
while ((k % len) > 0) {
k--;
fast = fast.next;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
ListNode res = slow.next;
slow.next = null;
fast.next = temp;
return res;
}
python实现
形成环,再移动,最后断开
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if not head or not head.next:
return head
tail = head
length = 1
while tail.next:
length += 1
tail = tail.next
#连成环
tail.next = head
k = k % length
for _ in range(length - k):
tail = tail.next
head = tail.next
tail.next = None
return head