一.删除链表中的节点
分析:这个方法也仅限于删除非末尾节点可用,不需要头结点。删除一个节点的时候将它赋值为下一个节点的值,然后将下一个节点删掉。
//结点信息类
public class ListNode{
int val;
ListNode next;
ListNode(int x) {val=x;}
}
//node.next=new node(x)将结点连成链
public class Solution10 {
public void deleteNode(ListNode node) {
node.val=node.next.val;
node.next=node.next.next;
}
public static void main(String args[]){
Solution10 solution10=new Solution10();
ListNode node1=new ListNode(1);
ListNode node2=new ListNode(2);
ListNode node3=new ListNode(3);
ListNode node4=new ListNode(4);
node1.next=node2;
node2.next=node3;
node3.next=node4;
solution10.deleteNode(node2);
}
}
双指针法可以删除链表的倒数第n个结点。可以默认head就是一个存着元素的普通结点,在进行删除操作的时候临时在前面加一个保存任意无意义值的头结点,让快指针先走n步,(不确定的时候就在for语句那里多输出调试几次,有时候也不好数清楚)慢指针再以同样的步速走,直到fast->next==null.慢指针刚好指向要删除的元素。
public class Solution11 {
public ListNode removeNthFromEnd(ListNode head, int n) {
//快慢指针法移除倒数第n个结点,只要让快指针
// 先移动到第n+1个结点,然后快慢指针再同时移动
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode fast=dummy;
ListNode slow=dummy;
for(int i=0;i<=n;i++){
//System.out.println(fast.val);
fast=fast.next;
}
while(fast!=null){
fast=fast.next;
slow=slow.next;
}
slow.next=slow.next.next;
return dummy.next;
}
public static void main(String args[]){
int r=3;
Solution11 solution11=new Solution11();
ListNode node1=new ListNode(3);
ListNode node2=new ListNode(2);
node1.next=node2;
ListNode node3=new ListNode(4);
node2.next=node3;
ListNode node4=new ListNode(7);
node3.next=node4;
ListNode head1 = solution11.removeNthFromEnd(node1, 4);
while(head1!=null){
System.out.println(head1.val);
head1=head1.next;
}
}
}
我想用一张难看的图来说明问题:
链表不是一串真正的链子。当你想要反转他,你需要做的仅仅是改变指针,而不是把头结点后的一个个结点摘下来,再挂到前面去。
import java.util.List;
public class Solution12 {
public ListNode reverseList(ListNode head) {
//如果链表为空或者仅有一个元素,直接返回
if(head==null||head.next==null) return head;
//如果链表只有两个元素
if(head.next.next==null) {
ListNode q=head;
head = head.next;
head.next=q;
head.next.next=null;
return head;
}
//用p指向head后的下一个元素
ListNode p=head.next;
//然后就将第一个元素与后面断开并指向^
head.next=null;
//让m指向p的下一个元素
ListNode m=p.next;
//当m之后还有元素
while(m.next!=null){
p.next=head;
head=p;
p=m;
m=m.next;
}
m.next=p;
p.next=head;
return m;
}
public static void main(String args[]){
Solution12 solution12=new Solution12();
ListNode head1=null;
ListNode node1=new ListNode(1);
ListNode node2=new ListNode(2);
ListNode node3=new ListNode(3);
ListNode node4=new ListNode(4);
ListNode node5=new ListNode(5);
node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=node5;
head1=solution12.reverseList(node1);
while(head1!=null){
System.out.println(head1.val);
head1=head1.next;
}
}
}
第一次用java写链表,经历了些许磕磕绊绊,但每次提交通过的时候,我是真的很开心。我记得大一学链表那会我悟性可差了,别人都会了我还是不会,没少为此受批评,也没少偷偷着急。写项目用到的时候还得时不时翻翻书看自己写的对不对。什么是成长?或许成长根本不是一个多么庞大的概念。成长就是以前做不到的事情现在能做到了,以前百思不得其解的事情后来想通了。我们不应惧惮长大,长大了才能面对很多以前承受不了的事情。不念过去,不惧将来,如此,甚好❤这段小鸡汤是今天的特别节目,嘻嘻意外吧。