LeetCode24
- 链表两两对换
This commit is contained in:
parent
f6d0c1582a
commit
acc3ac725c
113
src/main/java/cn/whaifree/leetCode/middle/LeetCode24.java
Normal file
113
src/main/java/cn/whaifree/leetCode/middle/LeetCode24.java
Normal file
@ -0,0 +1,113 @@
|
||||
package cn.whaifree.leetCode.middle;
|
||||
|
||||
import org.junit.Test;
|
||||
import cn.whaifree.leetCode.model.ListNode;
|
||||
|
||||
/**
|
||||
* 两两交换链表中的节点
|
||||
* 中等
|
||||
* 相关标签
|
||||
* 相关企业
|
||||
* 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
|
||||
*
|
||||
* 示例 1:
|
||||
* 输入:head = [1,2,3,4]
|
||||
* 输出:[2,1,4,3]
|
||||
*
|
||||
* 示例 2:
|
||||
* 输入:head = []
|
||||
* 输出:[]
|
||||
*
|
||||
* 示例 3:
|
||||
* 输入:head = [1]
|
||||
* 输出:[1]
|
||||
*
|
||||
*/
|
||||
public class LeetCode24 {
|
||||
|
||||
/**
|
||||
* 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; }
|
||||
* }
|
||||
* pre index tmp
|
||||
* 0 -> 1 -> 2 -> 3 -> 4 -> 5
|
||||
*
|
||||
* pre index tmp
|
||||
* 0 1 -> 2 -> 3 -> 4 -> 5
|
||||
* ----------^
|
||||
*
|
||||
* -----------
|
||||
* pre index tmp |
|
||||
* 0 1 -> 2 -> 3 -> 4 -> 5
|
||||
* ----------^
|
||||
*
|
||||
* -----------
|
||||
* pre index tmp |
|
||||
* 0 1 <- 2 -> 3 -> 4 -> 5
|
||||
* ----------^
|
||||
*
|
||||
* pre tmp index
|
||||
* 0-> 2 -> 1 -> 3 -> 4 -> 5
|
||||
*
|
||||
*
|
||||
* pre tmp index
|
||||
* 0-> 2 -> 1 -> 3 -> 4 -> 5
|
||||
*/
|
||||
public ListNode swapPairs(ListNode head) {
|
||||
if (head == null) {
|
||||
return head;
|
||||
}
|
||||
ListNode pre = new ListNode(0, head);
|
||||
ListNode tmp = head.next;
|
||||
ListNode index = head;
|
||||
head = pre;
|
||||
while (tmp != null) {
|
||||
pre.next = tmp;
|
||||
index.next = tmp.next;
|
||||
tmp.next = index;
|
||||
pre = index;
|
||||
index = pre.next;
|
||||
tmp = index == null ? null : index.next;
|
||||
}
|
||||
return head.next;
|
||||
}
|
||||
|
||||
public ListNode swapPairsD(ListNode head) {
|
||||
if (head == null) {
|
||||
return head;
|
||||
}
|
||||
return swap(head, head.next);
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归的关键:
|
||||
* 1. 结束条件
|
||||
* 2. 递归条件(只考虑当前这一点点的情况,剩下的交给下次递归)
|
||||
* @param pre
|
||||
* @param after
|
||||
* @return
|
||||
*/
|
||||
public ListNode swap(ListNode pre, ListNode after) {
|
||||
if (pre == null || after == null) {
|
||||
return pre;
|
||||
}
|
||||
// 递归后面的指针
|
||||
pre.next = swap(after.next, after.next == null ? null : after.next.next);
|
||||
after.next = pre;
|
||||
|
||||
return after;
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void test() {
|
||||
ListNode listNode = swapPairsD(ListNode.listNodeFromArray(new int[]{1,2,3,4,5}));
|
||||
ListNode.printList(listNode);
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user