- 移除链表元素
/**
* 删除链表中等于给定值 val 的所有节点。
*
* 示例:
*
* 输入: 1->2->6->3->4->5->6, val = 6
* 输出: 1->2->3->4->5
*
* 基本思路:建立新链表,遍历筛选非val值尾插进新链表中
*/
public class RemoveEle {
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public ListNode removeElements(ListNode head, int val) {
ListNode result = null; //创建结果链表,初始为null
ListNode last = null; //结果链表的尾结点,初始为null
ListNode cur = head;
while(cur.next != null){
ListNode next = cur.next; //此处为cur存档
if(cur.val != val){
cur.next = null;
//尾插
if(result == null){
result = cur;
}else{
last.next = cur;
}
last = cur; //更新链表的最后一个元素
}
cur = next; //回档,继续读原链表的下一个元素
}
return result;
}
}
- 反转链表
/**
* 反转一个单链表。
*
* 示例:
*
* 输入: 1->2->3->4->5->NULL
* 输出: 5->4->3->2->1->NULL
*
* 基本思路:创建新链表,将原表的元素头插进新表中
*/
public class ReverseListSolution {
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x; }
}
public ListNode reverseList1(ListNode head) {
ListNode result = null;
ListNode cur = head;
while(cur != null){
ListNode next = cur.next; //存档
//头插
cur.next = result;
result = cur;
cur = next; //回档
}
return result;
}
/**
* 进阶:
* 三引用遍历反转链表
*
* 基本思路:定义三个结点:
* prev--指向前一个结点,
* cur--指向当前结点,
* next--指向下一结点
* 当cur == null时停止遍历
*/
public ListNode reverseList2(ListNode head) {
if(head == null){
return null;
}
ListNode prev = null;
ListNode cur = head;
//prev-->cur-->next
while(cur != null){
ListNode next = cur.next;
cur.next = prev; //反转 next-->cur-->prev
prev = cur;
cur = next;
}
// 返回反转后的链表 此时prev已经指向最后一个结点,cur和next都指向空
return prev;
}
}
- 合并两个有序链表
/**
* 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
*
* 示例:
*
* 输入:1->2->4, 1->3->4
* 输出:1->1->2->3->4->4
*
* 基本思路:两个有