标签:
思路 1 :两个指针 p1 ,p2 ,p1从头开始遍历,当 p1 到达第 k 个节点时,p2 开始; 当 P1 到达链表的最后一个节点时,p2 所指的节点则为链表中倒数第 k 个节点。
public class Node{ public int data; public Node next; public Node(int data){ this.data = data; } public Node removeLastKNode(Node head,int k){ if(head == null || k < 1){ return head; } Node p1 = head; Node p2 = head; int num = 1; while(p1.next != null && num < k){ ++num; p1 = p1.next; } while(p1.next != null){ p1 = p1.next; p2 = p2.next; } p2.next = p2.next.next; return head; } }
思路 2:时间复杂度 O(n) ,空间复杂度 O(1)。
1>若链表为空或 K < 1,直接返回;
2>链表从头走到尾,每移动一步,k 值减 1 ;
3>若 k > 0,则没有倒数第 k 个节点,返整个链表;
若 k = 0,则头结点为倒数第 k 个节点,返回头指针;
若 k < 0 ,从头遍历寻找要删除节点的前一个节点,每移动一步就让 k 值加 1 ,当 k=0 时,指针值向的节点则为要删除节点的前一个节点。
public Node removeLastKthNode(Node head,int lastKth){ if(head == null || lastKth < 1){ return head; } Node p = head; while(p != null){ lastKth--; p = p.next; } if(lastKth == 0){ head = head.next; } if(lastKth < 0){ p = head; while(++lastKth != 0){ p = p.next; } p.next = p.next.next; } return head; }
标签:
原文地址:http://www.cnblogs.com/janenan/p/5672925.html