这一章是做完了代码随想录的链表相关题目,进行总结,在这里只贴出所有题目的链接,就不贴出完整题目了。
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null) return head;
// 统一操作,防止head出现null值
ListNode node = new ListNode(-1, head); // 一定要设置一个虚拟节点,要不然就会过不了用例元素全部一致的情况
ListNode now = node;
ListNode cur = head;
while(now != null) {
if(now.val == val) {
// 这里是关键,要去想明白其实这时候pre还在now的前一个结点那
cur.next = now.next;
} else {
cur = now;
}
now = now.next; //元素不断往下移动
}
return node.next;
}
}
代码与解析
class ListNode {
int val;
ListNode next;
public ListNode(){};
public ListNode(int val) {
this.val = val;
}
}
class MyLinkedList {
int size;
ListNode head;
/**
MyLinkedList() 初始化 MyLinkedList 对象
*/
public MyLinkedList() {
size = 0;
head = new ListNode();
}
/**
获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1
*/
public int get(int index) {
if(index < 0 || index >= size) {
return -1;
}
ListNode now = head;
for(int i = 0;i < index;i ++) {
now = now.next;
}
return now.next.val;
}
/**
将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点
*/
public void addAtHead(int val) {
addAtIndex(0, val);
}
/**
一个值为 val 的节点追加到链表中作为链表的最后一个元素
*/
public void addAtTail(int val) {
addAtIndex(size, val);
}
/**
一个值为 val 的节点插入到链表中下标为 index 的节点之前。
如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。
如果 index 比长度更大,该节点将 不会插入 到链表中
*/
public void addAtIndex(int index, int val) { // 记得size
if(index < 0) index = 0;
if(index > size) return;
size++;
ListNode now = head;
for(int i = 0;i < index;i ++) {
now = now.next;
}
ListNode temp = new ListNode(val);
temp.next = now.next;
now.next = temp;
}
/**
如果下标有效,则删除链表中下标为 index 的节点
*/
public void deleteAtIndex(int index) {
if(index < 0 || index >= size) return;
ListNode node = head;
size--;
if(size == 0) head = head.next;
for(int i = 0;i < index;i ++) {
node = node.next;
}
ListNode temp = node.next.next;
node.next = temp;
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null) return head;
// 这里的设置节点之类的很关键,一定要有个pre和temp去承接节点方面的东西
ListNode cur = head;
ListNode pre = null;
ListNode temp;
while(cur != null) {
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null) return head;
ListNode now = new ListNode(-1, head);
ListNode cur = now;
while(now.next != null && now.next.next != null) {
ListNode a = now.next;
ListNode b = now.next.next;
ListNode t = b.next;
b.next = a;
a.next = t;
now.next = b;
now = a;
}
return cur.next;
}
}
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode a = headA;
ListNode b = headB;
while(a != b) {
if(a != null) a = a.next;
else a= headB;
if(b != null) b = b.next;
else b = headA;
}
return a;
}
}