一、剑指 Offer II 027 回文链表
给定一个链表的 头节点 head ,请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。
示例 1:
输入: head = [1,2,3,3,2,1]
输出: true
示例 2:
输入: head = [1,2]
输出: false
提示:
链表 L 的长度范围为 [1, 105] 0 <= node.val <= 9
class Solution {
public boolean isPalindrome(ListNode head) {
Stack stack = new Stack();
ListNode p = head;
int len = 0;
while(p != null){
len++;
p = p.next;
}
for (int i = 0; i < len / 2 && head != null; i++) {
stack.push(head);
head = head.next;
}
if(len % 2 == 1) head = head.next;
boolean flag = true;
while(head != null && !stack.empty()){
Object peek = stack.peek();
ListNode a = (ListNode) stack.peek();
if(a.val != head.val){
flag = false;
}
stack.pop();
head = head.next;
}
return flag;
}
}
二、剑指 Offer II 024. 反转链表
给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
提示:
链表中节点的数目范围是 [0, 5000] -5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null)
return head;
ListNode finalNode = new ListNode(head.val);
ListNode fp = finalNode;
head = head.next;
ListNode p = head;
while(head != null){
p = head.next;
head.next = finalNode;
finalNode = head;
head = p;
if(p != null)
p = p.next;
}
return finalNode;
}
}
三、剑指 Offer 58 - II 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2 输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6 输出: "umghlrlose"
限制:
1 <= k < s.length <= 10000
class Solution {
public String reverseLeftWords(String s, int n) {
return s.substring(n, s.length()) + s.substring(0, n);
}
}