链表操作

Posted hanxiaomin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表操作相关的知识,希望对你有一定的参考价值。

定义一个单链表

public class ListNode 
int val;
ListNode next;
ListNode(int x)  val = x; 

1.链表反转

思路:先将下一节点纪录下来,然后让当前节点指向上一节点,再将当前节点纪录下来,再让下一节点变为当前节点。

public class MainClass 
    public static void main(String[] args) throws IOException 
        ListNode a=new ListNode(1);
        a.next=new ListNode(2);
        a.next.next=new ListNode(3);
        
        
        ListNode cur=reserves(a);
        while(cur!=null)
            System.out.println(cur.val);
            cur=cur.next;
        
    
    
    public static ListNode reserves(ListNode a)
        ListNode pre=null;
        ListNode cur=a;
        while(cur!=null)
            ListNode next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        
        return pre;
        
      

2.删除链表某个节点

前提:链表中值都是唯一的

public class MainClass 
    public static void main(String[] args) throws IOException 
        ListNode a=new ListNode(1);
        ListNode b=new ListNode(4);
        a.next=b;
        a.next.next=new ListNode(3);
        a.next.next.next=new ListNode(6);
        
        ListNode cur=deleteNode(a,b);
        while(cur!=null)
            System.out.println(cur.val);
            cur=cur.next;
        
    
    
    public static ListNode deleteNode(ListNode a,ListNode b)
        if(b.next==null)
            while(a.next!=b)
                a=a.next;
            
            a.next=null;          
        else if(a==b)
            a=null;
        else
            b.val=b.next.val;
            b.next=b.next.next;
        
        return a;
      

3.判断链表是否有环

public class MainClass 
    public static void main(String[] args) throws IOException 
        ListNode a=new ListNode(1);
        ListNode b=new ListNode(4);
        a.next=b;
        a.next.next=new ListNode(3);
        a.next.next.next=new ListNode(6);
        //a.next.next.next.next=b;
        
        boolean flag=isRing(a);
        System.out.println(flag);
    
    
    public static boolean isRing(ListNode head)
       if(head==null)
           return false;
        
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&fast.next!=null)
            slow=slow.next;
            fast=fast.next.next;
            if(slow==fast)
               return true; 
                 
        
        return false;
      

4.倒数K个节点

public class MainClass 
    public static void main(String[] args) throws IOException 
        ListNode a=new ListNode(1);
        ListNode b=new ListNode(4);
        a.next=b;
        a.next.next=new ListNode(3);
        a.next.next.next=new ListNode(6);
        a.next.next.next.next=new ListNode(7);;
        
        ListNode k=getReverNode(a,5);
        System.out.println(k.val);
    
    
    public static ListNode getReverNode(ListNode head,int k)
     
        if(head==null )
          return null;  
        
        
        ListNode fast=head;
        for(int i=0;i<k-1;i++)
            fast=fast.next;
        
        ListNode slow=head;
        while(fast.next!=null)
            fast=fast.next;
            slow=slow.next;
        
        return slow;
      

 

以上是关于链表操作的主要内容,如果未能解决你的问题,请参考以下文章

链表的基础操作专题小归纳

一文讲透链表操作,看完你也能轻松写出正确的链表代码

链表及其各种函数操作的实现方法

Python面试常考点之深入浅出链表操作

一文讲透链表操作,看完你也能轻松写出正确的链表代码

一文讲透链表操作,看完你也能轻松写出正确的链表代码