1. 程式人生 > >java實現---查詢單鏈表的倒數第K個節點,要求只能遍歷一次連結串列;;;刪除連結串列的倒數第k個節點

java實現---查詢單鏈表的倒數第K個節點,要求只能遍歷一次連結串列;;;刪除連結串列的倒數第k個節點

java實現

查詢單鏈表的倒數第K個節點,要求只能遍歷一次連結串列

  • 定義兩個前後節點forward和backward
  • 先讓forward走 k 步,再讓forward和backward一起走,當forward走到空,此時backward就走到了倒數第k步
class ListNode{
    int data;
    ListNode next;
}
public class Link{
    public static void FindTailK(ListNode first,int k){
        ListNode forward = first;
        ListNode backward = first;
        while(k-- != 0){
            forward = forward.next;
        }
        while(forward != null){
            forward = forward.next;
            backward = backward.next;
        }
        System.out.println(backward.data);
    }
    public static void main(String[] args) {
        ListNode n1 = new ListNode();
        ListNode n2 = new ListNode();
        ListNode n3 = new ListNode();
        ListNode n4 = new ListNode();
        ListNode n5 = new ListNode();
        n1.data = 1;
        n2.data = 2;
        n3.data = 3;
        n4.data = 4;
        n5.data = 5;
        n1.next = n2;
        n2.next = n3;
        n3.next = n4;
        n4.next = n5;
        FindTailK(n1,2);
    }
}

刪除連結串列的倒數第k個節點

  • 想要刪除倒數第k個節點,可以找到倒數第k+1個節點,即k的前一個節點
  • 第二步讓k的前一個節點的next指向k的後一個節點
  • 即k節點就相當於被刪除啦
public class Link{
    public static ListNode DeleteTailK(ListNode first,int k){
        ListNode forward = first;
        ListNode backward = first;
        while(k-- != 0){
            forward = forward.next;
        }
        while(forward.next != null){   //即最後的backward為k的前一個節點
            forward = forward.next;
            backward = backward.next;
        }
        backward.next = backward.next.next;
        return first;

    }
        public static void print(ListNode head){
        while(head != null){
            System.out.println(head.data);
            head = head.next;
        }
   }