【剑指offer】链表中倒数第K个节点

题目描述:

输入一个链表,输出该链表中倒数第k个节点。

解题方案:

让链表从头开始走到尾,每移动一步,就让k的值减1。

①假设链表为1-2-3,k=4,链表根本不存在倒数第4个节点。

走到的节点为:1-2-3

k的变化为:3 2 1

②假设链表为1-2-3,k=3,链表的倒数第3个节点是3

走到的节点为:1-2-3

k的变化为:2 1 0

③假设链表为1-2-3,k=2,链表的倒数第2个节点是2

走到的节点为:1-2-3

k的变化为:1 0 -1

以上三种情况,如果k值大于0,说明找不到倒数第k个节点,k值比链表长度还大;如果k值等于0,说明链表的头节点就是倒数第k个节点;如果k值小于0,那么这种情况怎么处理?

首先当从头到尾走一遍后,每移动一步k值减1,k值变为k-N(N是链表长度),那么让当前的k值重新从头节点走一遍,每移动一步就让k值加1,当k值为0时,则为N-k节点,即为所要找的倒数第k个节点的前一个节点。

核心代码实现如下:

public ListNode FindKthToTail(ListNode head,int k) {
		if(head == null || k < 1){
			System.out.println("链表为空或者k值小于1!");
			return null;
		}
		ListNode cur = head;
		while(cur != null){
			k--;
			cur = cur.next;
		}
		if(k > 0){
			System.out.println("k值大于链表长度!");
			return null;
		}else if(k == 0){
			return head;
		}else{
			cur = head;
			while(++k != 0){
				cur = cur.next;
			}
		}
		return cur.next;
    }
测试代码:
class LinkList{
	public ListNode head;
	private int length;
	
	class ListNode {
	    int val;
	    ListNode next = null;

	    ListNode(int val) {
	        this.val = val;
	    }
	}

	public LinkList(){
		head = null;
		length = 0;
	}
	
	// 将节点追加到链表的末尾
	public void appendLast(int value) {
		ListNode node = new ListNode(value);
		if(head == null){
			head = node;
			length++;
			return;
		}
		ListNode cur = head;//当前节点
		while(cur.next != null){
			cur = cur.next;
		}
		cur.next = node;
		length++;
	}
	
	public void printList(){
		ListNode cur = head;
		while(cur != null){
			System.out.print(cur.val + " ");
			cur = cur.next;
		}
	}
	
	public ListNode FindKthToTail(ListNode head,int k) {
		if(head == null || k < 1){
			System.out.println("链表为空或者k值小于1!");
			return null;
		}
		ListNode cur = head;
		while(cur != null){
			k--;
			cur = cur.next;
		}
		if(k > 0){
			System.out.println("k值大于链表长度!");
			return null;
		}else if(k == 0){
			return head;
		}else{
			cur = head;
			while(++k != 0){
				cur = cur.next;
			}
		}
		return cur.next;
    }
}


public class FindKthToTail {
	
	public static void main(String[] args) {
		LinkList list = new LinkList();
		list.appendLast(1);
		list.appendLast(2);
		list.appendLast(3);
		list.appendLast(4);
		list.appendLast(5);
		list.appendLast(6);
		list.appendLast(7);
		list.appendLast(8);
		
		list.printList();
		System.out.println();
		
		LinkList.ListNode ret = list.FindKthToTail(list.head, 1);
		if(ret == null){
			System.out.println("链表有错误或者K值设置不对!");
		}else{
			System.out.println(ret.val);
		}
	}
}
结果:

猜你喜欢

转载自blog.csdn.net/smile_yangyue/article/details/79324391
今日推荐