剑指 Offer 06. 从尾到头打印链表输入一个链表的头节点,从末尾到末尾返回每个节点的值(以数组形式返回)。类别解决方案6 {public int[]reverse print(list node head){//遍历
剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从末尾到末尾返回每个节点的值(以数组形式返回)。
类别解决方案6 {
public int[]reverse print(list node head){
//遍历后,根据数组下标将元素闪回数组。
int index = 0;
ListNode node = head//临时计算链表的长度。
while(节点!= null){
index++;
node = node.next
}
//需要打开一个数组
int[]RES = new int[index];
for(int I = index-1;我& gt=0;我–){
RES[I]= head . val;
head = head.next
}
返回res
}
}
指剑献十八。删除链表的节点
class Solution { public ListNode deleteNode(ListNode head, int val) { if(head == null)return null; if(head.val == val) return head.next;//本来是return head, 但是这种情况特色,删除头节点,这行可以删掉,因为后面采用了虚拟头节点 //删除这个节点的前一个节点的位置,先找到,然后变换指针就可以 ListNode dummy = new ListNode(0);//虚拟头节点 dummy.next = head;//让他指向头节点 ListNode node = dummy;//临时节点,被删除的前一个节点 while(node != null && node.next != null){ if(node.next.val == val){ node.next = node.next.next;//单链表删除就是这么简单 break; } node = node.next;//否则的话继续后移 } return dummy.next; }
引用链表中倒数第二个节点。
进入一个链表,输出链表倒数第k个节点。为了符合大多数人的习惯,这个题目从1开始计数,即链表的结束节点为最后一个节点。
例如,一个链表有六个节点,从第一个节点开始,它们的值依次是1,2,3,4,5,6。该链表底部的第三个节点是值为4的节点。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode getKthFromEnd(ListNode head, int k) { //如果求正数第2个节点,你会怎么做?直接用一个index ,往后走2次就到了 //这里用双指针,两个指针的距离为k, 同时往后移; ListNode fast = head, slow = head; while(fast != null && k>0){ fast = fast.next; k--; } //这里用双指针,两个指针的距离为k, 同时往后移; //slow 指的就是倒数第k个 while(fast != null){ fast = fast.next; slow = slow.next; } return slow; }}
大家加油:P