本文遇到的记录链表反转的问题
结点类
public class ListNode {
public int val;
public ListNode next;
}
最简单的反转
public ListNode reverse(ListNode head) {
if(head==null){
return head;
}
ListNode cur = head.next;
ListNode pre = head;
ListNode following;
while (cur!=null){
following = cur.next;
cur.next = pre;
pre = cur;
cur = following;
}
head.next=null;
return pre;
}
递归写法
public ListNode reverse2(ListNode head) {
if(head==null || head.next==null){
return head;
}
ListNode newHead = reverse(head.next);
//反转
head.next.next = head;
head.next = null;
return newHead;
}
两两交换链表结点
public static ListNode swapPairs(ListNode head) {
if(head==null||head.next==null){
return head;
}
ListNode first = new ListNode();
first.next = head;
ListNode listNode = first;
while (listNode.next != null && listNode.next.next != null) {
ListNode after = listNode.next.next;
ListNode before = listNode.next;
listNode.next = after;
before.next = after.next;
after.next = before;
listNode = before;
}
return first.next;
}
k个一组反转链表
将链表分为数个长度为k的小链表(最后一个链表可能小于k,小于k时不反转),每个链表按照单链表反转逻辑进行反转,反转和拼接成结果链表
public ListNode reverseKGroup(ListNode head, int k) {
//判断长度是否足够进行翻转
if (!isLong(head, k)) {
return head;
}
//截取翻转链表
ListNode tmp = head;
for (int i = 1; i < k; i++) {
tmp = tmp.next;
}
ListNode nextHead= tmp.next;
tmp.next = null;
//翻转链表
ListNode newHead = reverse(head);
//递归,当前尾结点拼接下一段的头结点
head.next = reverseKGroup(nextHead,k);
return newHead;
}
public boolean isLong(ListNode head, int k) {
int count = 0;
ListNode listNode = head;
while (listNode != null) {
count++;
listNode = listNode.next;
if (count == k) {
return true;
}
}
return count >= k;
}