面试:算法专题:链表
面试最考验一个人水平的还是算法题,今天就先总结一些,跟链表相关的题目
反转单链表
给你单链表的头节点 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;
}