1、倒序打印链表
//输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 // // // // 示例 1: // // 输入:head = [1,3,2] //输出:[2,3,1] // // // // 限制: // // 0 <= 链表长度 <= 10000 // Related Topics 链表
采用栈对列表中的节点进行存储,再对栈进行遍历
public int[] reversePrint(ListNode head) {
Stack<ListNode> stack = new Stack<ListNode>();
ListNode temp = head;
while (temp != null) {
stack.push(temp);
temp = temp.next;
}
int size = stack.size();
int[] print = new int[stack.size()];
//这里不能直接在循环中写stack.size(),因为size在不断减小
for (int i = 0; i < size; i++) {
print[i] = stack.pop().val;
}
return print;
}
2、打印倒数第k个节点
//输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 // // 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。 // // // // 示例: // // //给定一个链表: 1->2->3->4->5, 和 k = 2. // //返回链表 4->5. // Related Topics 链表 双指针
采用双节点的方式来做,双节点即两个节点相差保证为k,但其中一个遍历到了最后一个节点,另一个节点也就遍历到了倒数第k个节点
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode node1 = dummyHead;
ListNode node2 = dummyHead;
for (int i = 0; i < k; i++) {
node1 = node1.next;
}
while(node1 != null){
node1 = node1.next;
node2 = node2.next;
}
return node2;
}