(一)reverse linked list
https://leetcode.com/problems/reverse-linked-list/description/
题目:逆转链表;
解答:使用两个指针:prev和curt, 从头到尾依次变换指针方向;
代码:
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
while (head != null) {
ListNode temp = head.next;
head.next = prev;
prev = head;
head = temp;
}
return prev;
}
}
(二)reverse linked list ii
https://leetcode.com/problems/reverse-linked-list-ii/description/;
题目:将链表从m到n的位置逆转;
解答:需要讲m前一个节点和n的后一个节点保存,以便逆转完成后重新连接链表;
代码:
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null || m >= n) {
return head;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
for (int i = 1; i < m; i++) {
head = head.next;
}
ListNode prev = head;
ListNode cutLeft = prev.next;
head = head.next;
ListNode post = head.next;
for (int i = m; i < n; i++) {
if (head != null && post != null) {
ListNode temp = post;
post = temp.next;
temp.next = head;
head = temp;
}
}
prev.next = head;
cutLeft.next = post;
return dummy.next;
}
}
(三)reverse nodes in k-group
https://leetcode.com/problems/reverse-nodes-in-k-group/description/
题目:将链表每k组元素进行逆转;
例如:
Given this linked list:1->2->3->4->5
For k = 2, you should return:2->1->4->3->5
For k = 3, you should return:3->2->1->4->5
解答:写出单个逆转的子函数,形参为当前需逆转链表的前一个节点和k,返回逆转完成后的链表最后一个节点(即为下一个需逆转链表的前一个节点);
原链表:head -> n1 -> n2 -> ... -> nk -> nk+1;
变换后:head -> nk ->nk-1 -> ... -> n1 ->nk+1;
返回:n1;
代码:
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
while (head != null) {
head = reverseK(head, k);
}
return dummy.next;
}
private ListNode reverseK(ListNode head, int k) {
ListNode reversePrev = head;
ListNode prev = null;
head = head.next;
ListNode reverseHead = head;
ListNode reversePost = head;
for (int i = 0; i < k; i++) {
if (reversePost == null) {
return null;
}
reversePost = reversePost.next;
}
while (head != reversePost) {
ListNode temp = head.next;
head.next = prev;
prev = head;
head = temp;
}
reversePrev.next = prev;
reverseHead.next = head;
return reverseHead;
}
}