Swapping Nodes in a Linked List

给一个链表, 给一个数组k, 求交换开始第k个node和倒数第k个node的值.

这个题我看答案是扫了三次, 我用的stack

/**
 * 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 {
    ListNode first = null;
    ListNode last = null;
    public ListNode swapNodes(ListNode head, int k) { 
        ListNode dummy = head;
        Stack<ListNode> st = new Stack<>();
        for(int i = 0; i < k - 1; i++) {
            st.add(head);
            head = head.next;
        }
        first = head;
        while(head != null){
            st.add(head);
            head = head.next;
        }
        for(int i = 0; i < k - 1; i++) { 
            st.pop();
        }
        last = st.peek();
        int tmp = first.val;
        first.val = last.val;
        last.val = tmp;
        return dummy;
    } 
}