【算法专题】


面试最考验一个人水平的还是算法题,今天就先总结一些,跟链表相关的题目

反转单链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表

public ListNode reverseList(ListNode head){
	ListNode curr = head;
	ListNode prev = null;
	while(curr != null){
		ListNode temp = curr.next;
		curr.next = prev;
		prev = curr;
		curr = temp;
	}
	return prev;
}

反转指定区间内的单链表

将一个链表 m 位置到 n 位置之间的区间反转

public ListNode reverseBetween(ListNode head, int m, int n){
	if(head == null) return null;
	ListNode res = new ListNode(-1);
	res.next = head;
	ListNode pre = res; // 备份指针
	// 移动指针,找到m之前的位置
	for(int i = 1; i < m; i++){
		pre = pre.next;
	}
	// 创建当前指针
	ListNode curr = pre.next;
	for(int i = m; i < n; i++){
		ListNode temp = curr.next;
		curr.next = temp.text;
		temp.next = pre.next;
		pre.next = temp;
	}
	return res.next;
}

回文链表

请判断一个链表是否为回文链表。
思路:准备一个栈,将链表中的所有元素全压到栈里去,遍历整个链表与栈中元素对比,有一个不一样就返回false,否则返回true

public boolean isPalindrome(ListNode head){
	Stack<ListNode> stack = new Stack<ListNode>();
	ListNode curr = head;
	while(curr != null){
		stack.push(curr);
		curr = curr.next;
	}
	while(head != null){
		if(head.value != stack.pop().value){
			return false;
		}
		head = head.next;
	}
	return true;
}

环形链表

给你一个链表的头节点 head ,判断链表中是否有环
如果链表中存在环 ,则返回 true 。 否则,返回 false
思路:设置快慢指针,初始都在头节点,慢指针针每次走一步,快指针每次走两步,如果相遇就说明有环,如果有一个为空说明没有环

public boolean hasCycle(ListNode head){
	if(head == null || head.next == null){
		return false;
	}
	ListNode slow = head;
	ListNode fast = head;
	while(fast != null && fast.next != null){
		slow = slow.next;
		fast = fast.next;
		if(fast == slow){
			return true;
		}
	}
	return false;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值