Leetcode203 移除链表元素
题目链接
注意 为了使后续节点方式统一 要人为设置链表头节点
链表的处理 一定要明白如何找前置节点
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/class Solution {public ListNode removeElements(ListNode head, int val) {if(head == null){return head;}ListNode dummy = new ListNode(-1,head);ListNode pre = dummy;ListNode now = head;while(now != null){if(now.val == val){pre.next = now.next;}else{pre = now;}now = now.next;}return dummy.next;}
}
Leetcode 707 设计链表
题目链接
注意设计链表 要掌握 ::设计链表节点,设计头节点,设计链表长度,掌握如何查找前置节点,和当前节点
class ListNode{int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}
}class MyLinkedList {int size;ListNode head;public MyLinkedList() {this.size = 0;head = new ListNode(-1);}public int get(int index) {if (index < 0 || index >= size) {return -1;}ListNode cur = head;for (int i = 0; i <= index; i++) {cur = cur.next;}return cur.val;}public void addAtHead(int val) {addAtIndex(0, val);}public void addAtTail(int val) {addAtIndex(size, val);}public void addAtIndex(int index, int val) {if (index <= size) {ListNode pre = head;ListNode p = new ListNode(val);for (int i = 0; i < index; i++) {pre = pre.next;}p.next = pre.next;// if(index == size){// p.next = null;// }else{// p.next = pre.next;// }pre.next = p;size++;}}public void deleteAtIndex(int index) {if (index < 0 || index >= size) {return;}ListNode pre = head;for (int i = 0; i < index; i++) {pre = pre.next;}pre.next = pre.next.next;size--;}
}/*** 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);*/
Leetcode 206 反转链表
题目链接
利用双指针思想 直接原地反转 不用新的空间
改变指针方向
首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。
然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。
为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。
接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。
最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val = val; }* ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode reverseList(ListNode head) {ListNode dummy = new ListNode(-1,head);ListNode cur = head;ListNode pre = null;ListNode tmp = null;while(cur!=null){tmp = cur.next;cur.next = pre;pre = cur;cur = tmp;}return pre;}
}