力扣203
使用迭代法定义头节点,要注意的是判断当前指针指向的元素不是要删除的元素后需要保留该元素
/**
* 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; }
* }
*/
//prev是当前元素的上一个元素指针,next 是当前元素的下一个元素指针,
//要引入一个dummy节点dummy.next和prevs指针,用来保留记录上一个节点
//链表的移除元素是指针的指向直接跳过要删除的元素,指向下一个元素
//head代表当前元素
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
while(head != null){
if(head.val == val){
prev.next = head.next;// 找到val值时,prev的下一个指向元素直接指向链表里和val相同元素的一下元素
}else{
prev = head;//当不是val,在移动head前把head的值赋给prev
}
head = head.next;
}
return dummy.next;
}
}
力扣206反转链表
思路是把2移到1的前面,把3移到2的前面,把4移到3的前面…以此类推
/**
* 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; }
* }
*/
//head,dummy,dnext,hnext都是节点,都需要提前定义
class Solution {
public ListNode reverseList(ListNode head) {
//定义dummy
ListNode dummy = new ListNode(0);
dummy.next = head;//节点的指针指向head
//while循环的机制是判断括号里的布尔表达式,如果是true就继续
while(head != null && head.next != null){
//定义dnext,hnext节点
ListNode dnext = dummy.next;
ListNode hnext = head.next;
dummy.next = hnext;
head.next = hnext.next;
hnext.next = dnext;
}
return dummy.next;
}
}