两两交换链表中的节点

2019-04-12  本文已影响0人  最困惑的时候就是能成长的时候

24. 两两交换链表中的节点

1.想法:

这个题重要的是保证下一个做两两交换的节点首先被缓存了。例如:


image.png

对于1,2节点来说我们要现在交换,但是如果交换后3就找不到,所以必须先把3记录了,然后再去把1,2交换
,等1,2交换了变成了2,1,然后让1指向3,4交换后的节点就好了。
那么我们现在设现在要交换的节点是newNode(相当于1,和后来的3们)用next表示newNode的下一个节点(相当于2,和后来的4),那么什么时候停止呢?我们可以有一下的总结:
head \begin{cases} A.==null,&直接返回head\\ B.!=null, &0.head.next &return head\\ C.&1.head.next!=null\&\&head.next.next ==null &交换后,返回head.next\\ D.&2.head.next!=null\&\&head.next.next !=null &记录head.next.next\\ &&交换head和head.next,返回重复上述过程 \end{cases}
那么我们就可以写出代码了

2.代码:

递归写法:(下面的代码中字母对应上面分类中的字母,情况一致)

public ListNode swapPairs(ListNode head) {
         if(head == null||head.next==null)return head;   //A
         else{
             if(head!=null){                  
                 if(head.next!=null) {  
                     ListNode next = head.next;
                     if(head.next.next!=null) {       //D
                         ListNode newHead = head.next.next;
                         next.next = head;
                         head.next = MySwapHead(newHead);
                     }else{                         //C
                         next.next = head;
                         head.next = null;
                     }
                     return next;
                 }else{
                     return head;    //B
                 }
             }else{
                 return head;  //A
             }
         }
    }

迭代写法:

 public ListNode swapPairs(ListNode head) {
         if(head == null||head.next==null)return head;
         else{
             ListNode newHead = head.next;
             ListNode last=null,nownext=newHead,nowheir=null;
             while(head!=null){
                 if(head.next!=null) {
                     if (head.next.next != null) {
                         nowheir = head.next.next;
                         nownext = head.next;
                         nownext.next = head;
                         if(last!=null) {
                             last.next = nownext;
                         }
                         last = head;
                         head = nowheir;
                     } else {
                         nownext = head.next;
                         nownext.next = head;
                         if(last!=null) {
                             last.next = nownext;
                         }
                         break;
                     }
                 }else{
                     last.next = head;
                     break;
                 }

             }
            
             return newHead;
         }
    }

不知道为什么运行超时?

上一篇下一篇

猜你喜欢

热点阅读