/**
* 在一个大小为 n 且 n 为 偶数 的链表中,对于 0 <= i <= (n / 2) - 1 的 i ,第 i 个节点(下标从 0 开始)的孪生节点为第 (n-1-i) 个节点 。
*
* 比方说,n = 4 那么节点 0 是节点 3 的孪生节点,节点 1 是节点 2 的孪生节点。这是长度为 n = 4 的链表中所有的孪生节点。
* 孪生和 定义为一个节点和它孪生节点两者值之和。
*
* 给你一个长度为偶数的链表的头节点 head ,请你返回链表的 最大孪生和 。
* https://leetcode.cn/problems/maximum-twin-sum-of-a-linked-list/
*/
public class PairSum {
/**
* 题解:
* 1. 先使用快慢指针获取到后2/n的上一个节点
* 2. 把后半部分直接反转
* 3. 将i 和i + 2/n位置节点的数据相加获取到最大的孪生和.
* @param head
* @return
*/
public int pairSum(ListNode head) {
ListNode slow = head
ListNode fast = head
while (fast.next != null && fast.next.next!= null) {
fast = fast.next.next
slow = slow.next
}
ListNode oddListNode = slow.next
slow.next = null
ListNode cur = oddListNode
ListNode prev = null
while(cur != null){
ListNode next = cur.next
cur.next = prev
prev = cur
cur = next
}
int res = 0
while(head != null){
res = Math.max(prev.val+head.val,res)
head = head.next
prev = prev.next
}
return res
}
private class ListNode {
ListNode next
int val
}
}