1、206. 反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
public ListNode reverseList(ListNode head) {
ListNode newHead=null;
while (head!=null){
ListNode next=head.next;
head.next=newHead;
newHead=head;
head=next;
}
return newHead;
}
2、234. 回文链表
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
public boolean isPalindrome(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
if (fast != null)
slow = slow.next;
slow = reverseList(slow);
fast = head;
while (slow != null) {
if (slow.val != fast.val) {
return false;
}
slow = slow.next;
fast = fast.next;
}
return true;
}
public ListNode reverseList(ListNode head) {
ListNode newHead = null;
while (head != null) {
ListNode next = head.next;
head.next = newHead;
newHead = head;
head = next;
}
return newHead;
}
3、92. 反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
/*
* 思路:
* 首先找到m和n对应的节点,m之前的节点,n之后的节点
* 翻转m到n
* n之后的节点即为翻转后的尾节点
* m之前的节点:为空,则返回翻转链表;不为空,则m之前的节点的next为翻转链接,返回值为head
* */
public ListNode reverseBetween(ListNode head, int m, int n) {
//注意从 1 开始
int i = 1;
ListNode nNode = head;
ListNode mPre = null;
while (i < m && nNode != null) {
mPre = nNode;
nNode = nNode.next;
i++;
}
if (i != m)
return null;
ListNode mNode = nNode;
while (i < n && nNode != null) {
nNode = nNode.next;
i++;
}
if (i != n)
return null;
ListNode nPost = nNode.next;
//定义翻转之后的尾部
ListNode newHead = nPost;
while (mNode != null) {
if (mNode == nPost) {
break;
}
ListNode next = mNode.next;
mNode.next = newHead;
newHead = mNode;
mNode = next;
}
//m之前的节点,如果不为空,返回head
if (mPre != null) {
mPre.next = newHead;
return head;
} else {//如果为空,直接返回newHead
return newHead;
}
}