代码随想录训练营第三天|LeetCode203移除链表元素,LeetCode707设计链表,LeetCode206反转链表
题目链接203移除链表元素
思路:在头结点前设置一个哨兵结点,然后再定义两个指针,一个指向哨兵结点(不参与比较),一个指向头结点,当指向头结点的指针不为空且不等于所查找的元素时,两个指针同步后移,若找到所查找的元素则删除,则原头结点指向的指针往后平移。
代码如下:
public ListNode removeElements(ListNode head, int val) {
ListNode s = new ListNode(-1, head);
ListNode p1 = s;
ListNode p2 = s.next;
while(p2 != null){
if(p2.val == val){
p1.next = p2.next;//删除元素,p2向后平移
p2 = p2.next;
}else{
//p1,p2向后平移
p1 = p1.next;
p2 = p2.next;
}
}
return s.next;
}
题目链接707设计链表
思路:一些基本方法,需要仔细
代码如下:
private Node head;//头结点
//结点类
private class Node{
int val;
Node next;
public Node(int val, Node next){
this.val = val;
this.next = next;
}
}
//头部添加元素
public void addAtHead(int val){
//1.链表为空
//head = new Node(val,null);
//2.链表非空
head = new Node(val,head);
}
//遍历链表元素
public void loop(){
Node curr = head;
while(curr != null){
System.out.println(curr.val);
curr = curr.next;
}
}
//找到尾结点
public Node findAtTail(){
if(head == null){
return null;
}
Node curr;
for(curr = head; curr.next != null; curr = curr.next){
}
return curr;
}
//尾部添加元素
public void addAtTail(int val){
//首先得找到尾部结点,于是再定义一个找到尾部结点的方法
Node tail = findAtTail();
if(tail == null){
addAtHead(val);
return;
}
tail.next = new Node(val,null);
}
//找到指定索引结点
public Node findNode(int index){
int i = 0;
for(Node curr = head; curr != null;curr = curr.next,i++){
if(i == index){
return curr;
}
}
return null;
}
//根据索引获取元素
public int get(int index) {
//同样先找到索引所在的结点,于是再定义一个找到指定索引结点的方法
Node node = findNode(index);
if(node != null){
return node.val;
}
return -1;
}
//插入元素
public void addAtIndex(int index, int val){
if(index == 0){
addAtHead(val);
return;
}
Node pre = findNode(index - 1);//找到上一个结点
if(pre == null){
System.out.println("所插入点不存在");
}
pre.next = new Node(val,pre.next);
}
//删除元素
public void deleteAtIndex(int index) {
if(index == 0){
if(head != null){
head = head.next;
return ;
}else{
System.out.println("删除异常");
}
}
Node pre = findNode(index - 1);
Node curr;
if (pre != null && (curr = pre.next) != null) {
pre.next = curr.next;
} else {
System.out.println("删除异常");
}
}
题目链接206反转链表
思路:构造一个新链表,从原来的链表依次拿到每个节点,创建新节点添加到新链表的头部,完成后新链表即是倒序的
public ListNode reverseList(ListNode head) {
ListNode node = null;
ListNode p = head;
while(p != null){
node = new ListNode(p.val,node);//即头插法
p = p.next;
}
return node;
}