力扣-24-两两交换链表中的节点
一说到链表题,最长考的方法就是递归和迭代
class Solution { /** * 迭代地实现链表中两两节点的交换 * 新链表的头结点 * temp表示当前到达的节点 * 交换前:temp -> node1 -> node2 * 交换后:temp -> node2 -> node1 * 交换方式: * temp.next = node2 * node1.next = node2.next * node2.next = node1 */ public ListNode swapPairs(ListNode head) { if (head == null || head.next == null) return head; // 创建哨兵节点 ListNode sentinel = new ListNode(-1); sentinel.next = head; ListNode temp = sentinel; // temp后有至少两个节点时才需要交换 while (temp.next != null && temp.next.next != null) { ListNode node1 = temp.next; ListNode node2 = temp.next.next; // 交换node1和node2 temp.next = node2; node1.next = node2.next; node2.next = node1; // temp 重新赋值 temp = node1; } return sentinel.next; } }
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode swapPairs(ListNode head) { // 空链表和单节点链表直接返回 if (head == null || head.next == null) return head; ListNode newHead = head.next; head.next = swapPairs(newHead.next); // 递归地交换除前两个节点以外的节点 newHead.next = head; return newHead; } }
力扣-25-K个一组翻转链表
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode dummy = new ListNode(0); // 哨兵节点 dummy.next = head; ListNode prev = dummy; ListNode end = dummy; while (end.next != null) { for (int i = 0; i < k && end != null; i++) end = end.next; if (end == null) break; ListNode start = prev.next; ListNode next = end.next; // 保留下一段的开头 end.next = null; // 在此处断开 prev.next = reverse(start); start.next = next; prev = start; end = prev; } return dummy.next; } private ListNode reverse(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode next = curr.next; // 当前节点的下一个节点 curr.next = prev; prev = curr; curr = next; } return prev; } }
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!