博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【剑指offer】链表中倒数第K个节点
阅读量:4113 次
发布时间:2019-05-25

本文共 2303 字,大约阅读时间需要 7 分钟。

题目描述:

输入一个链表,输出该链表中倒数第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);		}	}}
结果:
你可能感兴趣的文章
【视频教程】帝国CMS模板开发制作网站系列教程04
查看>>
ES6之Proxy 的巧用
查看>>
【视频教程】帝国CMS制作网站系列教程05
查看>>
【视频教程】帝国CMS制作网站系列教程06
查看>>
【HTML 教程】链接标签
查看>>
json2canvas:使用JSON生成小程序海报
查看>>
还学不会webpack?看这篇!
查看>>
canvas文本绘制自动换行、字间距、竖排等实现
查看>>
【HTML 教程】多媒体标签
查看>>
刚刚!华为突然传来这一消息,我想辞职了
查看>>
HTTPS是如何工作的
查看>>
组件化设计思维 – 从规范到工具的构建与探索
查看>>
JavaScript函数式编程究竟是什么?
查看>>
21个极大提高开发效率的VS Code快捷键
查看>>
这些Vue3.0的最新技能你掌握了吗?
查看>>
5种处理Vue异常的方法
查看>>
漫谈前端性能,突破React应用瓶颈
查看>>
如何衡量一个人的 JavaScript 水平?
查看>>
北大计算机系女神每天必看必学的IT公众号
查看>>
JavaScript中数组的栈方法
查看>>