数据结构与算法学习笔记3--------单链表(2)

几道面试题

1.查找倒数第几个

//题目2:查找获取单链表倒数第index个结点
	//1.编写一个方法接收head结点,接收一个index(表示倒数第index个结点)
	//2.先把链表从头到尾遍历,得到链表长度length
	//3.得到length后,从链表第一个开始遍历,遍历length-index个
	
	public static HeroNode FindLastNode(HeroNode head,int index) {
		//判断链表是否为空
		if(head.next==null) {
			return null;
		}
		
		int length = getLength(head);
		
		if(index<=0 || index>length) {
			return null;
		}
		
		HeroNode temp = head.next;
		for(int i =0;i< length - index;i++) {
			temp = temp.next;
		}
		return temp;
	}

这题难度在于设置循环参数,需要举例子,比如共有5个结点,要倒数第二个,那么得到length=5之后,从第一个开始遍历,遍历5-2=3个结点,每个结点指向后继然后返回最后的这个结点

2.单链表反转

//题目3:单链表反转
	public static void reverseList(HeroNode head) {
		//判断是否为空 如果是空或者只有一个结点则不用反转
		if(head.next == null || head.next.next==null) {
			return;
		}
		HeroNode temp = head.next;
		HeroNode next = null;//定义指向当前结点temp的下一个结点
		
		HeroNode reverseHead = new HeroNode(0, null, null);
		
		//遍历原来的链表 把结点插入新链表的头部
		while(temp!=null) {
			next = temp.next;
			temp.next = reverseHead.next;
			reverseHead.next=temp;
			temp = next;
		}
		//将head指向新的链表头部
		head.next = reverseHead.next;
	}

思路就是新建一个头部结点,将之前链表的结点依次插入头部位置,这样的话相当于是逆序排列了一遍,next是用来遍历原来链表的,如果没有next的话,将结点插入后,就找不到之后的索引了。

3.语法示例

//题目4:逆序打印链表 使用栈
	public static void reversePrint(HeroNode head) {
		if(head.next==null) {
			return;
		}
		Stack<HeroNode> stack = new Stack();
		HeroNode temp = head.next;
		
		while(temp!=null) {
			stack.push(temp);
			temp = temp.next;
		}
		
		while(stack.size()>0) {
			System.out.println(stack.pop());
		}
	}

这里使用了util类的stack类,也就是栈,利用了栈结构先进后出的性质,将链表结点压入栈,这样第一个pop出来的就是原来的最后一个,实现了逆序打印

4.合并有序链表

//题目5:合并两个有序单链表
	public static HeroNode CombineNode(HeroNode head1,HeroNode head2) {
		HeroNode newNode = new HeroNode(0,null,null);
		HeroNode temp = newNode.next;
		
		while(head1!=null&&head2!=null) {
			if(head1.no>head2.no) {
				temp.next=head2;
				temp = temp.next;
				head2 = head2.next;
			}else {
				temp.next=head1;
				temp = temp.next;
				head1 = head1.next;
			}
		}
		if(head1==null) {
			temp.next = head2;
		}
		if(head2==null) {
			temp.next = head1;
		}
		return newNode;
		
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值